Problem p02315 (C++)

Buggy submission (status: Runtime Error):
// #define USE_CPP11
// #define USE_PRINTF

#include <algorithm>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#ifdef USE_CPP11
#include <functional>
#include <unordered_map>
#include <unordered_set>
#endif

#define PRINT(obj) cout << obj << endl
#define REP(i, n) for (int(i) = 0; (i) < (n); i++)
#define SPACE " "

typedef long long ll;

using namespace std;

const int INF = 1e9;

namespace Scanner {
#ifdef USE_PRINTF
int nextInt() {
  int d;
  scanf("%d", &d);
  return d;
}
float nextFloat() {
  float f;
  scanf("%f", &f);
  return f;
}
double nextDouble() {
  double f;
  scanf("%lf", &f);
  return f;
}
string nextString() {
  string s;
  scanf("%s", &s);
  return s;
}
ll nextll() {
  ll l;
  scanf("%ll", &l);
  return l;
}
#else
int nextInt() {
  int d;
  cin >> d;
  return d;
}
float nextFloat() {
  float f;
  cin >> f;
  return f;
}
double nextDouble() {
  double f;
  cin >> f;
  return f;
}
string nextString() {
  string s;
  cin >> s;
  return s;
}
ll nextll() {
  ll l;
  cin >> l;
  return l;
}
#endif

string getLine() {
  string input;
  getline(cin, input);
  return input;
}
}; // namespace Scanner

namespace myLibrary {
vector<string> split(const string &str, char delim) {
  vector<string> ret;
  size_t current = 0, found;
  while ((found = str.find_first_of(delim, current)) != string::npos) {
    ret.push_back(string(str, current, found - current));
    current = found + 1;
  }
  ret.push_back(string(str, current, str.size() - current));
  return ret;
}

#ifdef USE_CPP11
///
/// higher-order functional
/// This is something like map in haskell, python, etc.
/// Sample usage:
///   vector<int> a = {1, 2, 3, 4, 5};
///   vector<int> b = myLibrary::_Map<int, int>(a, [](int n){
///     return n * n;
///   });
/// Result:
///   b = 1, 4, 9, 16, 25
///
template <typename T_IN, typename T_OUT, class Functor>
vector<T_OUT> _Map(vector<T_IN> src, Functor func) {
  vector<T_OUT> ret;
  for (int i = 0; i < src.size(); i++) {
    ret.push_back(func(src[i]));
  }
  return ret;
}
#endif

}; // namespace myLibrary

/// BEGIN //////////////////////////////////////////////////////////

struct Item {
public:
  bool isUsed;
  int v, w;
  Item() {}
  Item(int v, int w) : isUsed(false), v(v), w(w) {}
};

int main() {
  int N = Scanner::nextInt();
  int W = Scanner::nextInt();
  Item items[101];

  REP(i, N) {
    int v = Scanner::nextInt();
    int w = Scanner::nextInt();
    items[i] = Item(v, w);
  }

  static int dp[101][10001];

  REP(i, N + 1) {
    REP(j, W + 1) {
      if (j < items[i].w) {
        dp[i + 1][j] = dp[i][j];
      } else {
        dp[i + 1][j] = max(dp[i][j], dp[i][j - items[i].w] + items[i].v);
      }
    }
  }
  PRINT(dp[N][W]);

  return 0;
}

/// END   //////////////////////////////////////////////////////////

Fixed submission:
// #define USE_CPP11
// #define USE_PRINTF

#include <algorithm>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <iomanip>
#include <iostream>
#include <list>
#include <map>
#include <memory>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <utility>
#include <vector>

#ifdef USE_CPP11
#include <functional>
#include <unordered_map>
#include <unordered_set>
#endif

#define PRINT(obj) cout << obj << endl
#define REP(i, n) for (int(i) = 0; (i) < (n); i++)
#define SPACE " "

typedef long long ll;

using namespace std;

const int INF = 1e9;

namespace Scanner {
#ifdef USE_PRINTF
int nextInt() {
  int d;
  scanf("%d", &d);
  return d;
}
float nextFloat() {
  float f;
  scanf("%f", &f);
  return f;
}
double nextDouble() {
  double f;
  scanf("%lf", &f);
  return f;
}
string nextString() {
  string s;
  scanf("%s", &s);
  return s;
}
ll nextll() {
  ll l;
  scanf("%ll", &l);
  return l;
}
#else
int nextInt() {
  int d;
  cin >> d;
  return d;
}
float nextFloat() {
  float f;
  cin >> f;
  return f;
}
double nextDouble() {
  double f;
  cin >> f;
  return f;
}
string nextString() {
  string s;
  cin >> s;
  return s;
}
ll nextll() {
  ll l;
  cin >> l;
  return l;
}
#endif

string getLine() {
  string input;
  getline(cin, input);
  return input;
}
}; // namespace Scanner

namespace myLibrary {
vector<string> split(const string &str, char delim) {
  vector<string> ret;
  size_t current = 0, found;
  while ((found = str.find_first_of(delim, current)) != string::npos) {
    ret.push_back(string(str, current, found - current));
    current = found + 1;
  }
  ret.push_back(string(str, current, str.size() - current));
  return ret;
}

#ifdef USE_CPP11
///
/// higher-order functional
/// This is something like map in haskell, python, etc.
/// Sample usage:
///   vector<int> a = {1, 2, 3, 4, 5};
///   vector<int> b = myLibrary::_Map<int, int>(a, [](int n){
///     return n * n;
///   });
/// Result:
///   b = 1, 4, 9, 16, 25
///
template <typename T_IN, typename T_OUT, class Functor>
vector<T_OUT> _Map(vector<T_IN> src, Functor func) {
  vector<T_OUT> ret;
  for (int i = 0; i < src.size(); i++) {
    ret.push_back(func(src[i]));
  }
  return ret;
}
#endif

}; // namespace myLibrary

/// BEGIN //////////////////////////////////////////////////////////

struct Item {
public:
  bool isUsed;
  int v, w;
  Item() {}
  Item(int v, int w) : isUsed(false), v(v), w(w) {}
};

int main() {
  int N = Scanner::nextInt();
  int W = Scanner::nextInt();
  Item items[101];

  REP(i, N) {
    int v = Scanner::nextInt();
    int w = Scanner::nextInt();
    items[i] = Item(v, w);
  }

  static int dp[102][10002];

  REP(i, N + 1) {
    REP(j, W + 1) {
      if (j < items[i].w) {
        dp[i + 1][j] = dp[i][j];
      } else {
        dp[i + 1][j] = max(dp[i][j], dp[i][j - items[i].w] + items[i].v);
      }
    }
  }
  PRINT(dp[N][W]);

  return 0;
}

/// END   //////////////////////////////////////////////////////////