Problem p03163 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#if 1
#define int long long
#define MAX LLONG_MAX
#define MIN LLONG_MIN
#define stoi stoll
#else
#define MAX INT_MAX
#define MIN INT_MIN
#endif
#define INF MAX / 2
#define ALL(obj) (obj).begin(), (obj).end()
#define fi first
#define se second
const int NIL = -1;
const int MOD = 1000000007;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
using namespace std;

int pow(int x, int n) {
  int res = 1;
  while (n) {
    if (n & 1)
      res *= x;
    x *= x;
    n >>= 1;
  }
  return res;
}
int get_gcd(int a, int b) {
  while (1) {
    if (a < b)
      swap(a, b);
    if (b == 0)
      return a;
    a %= b;
  }
}
int get_lcm(int a, int b) { return a * b / get_gcd(a, b); }
bool chmin(int &a, int b) {
  if (a > b) {
    a = b;
    return true;
  } else
    return false;
}
bool chmax(int &a, int b) {
  if (a < b) {
    a = b;
    return true;
  } else
    return false;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

//-------------------------テンプレここまで-------------------------//

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int N, W;
  cin >> N >> W;
  static int w[100], v[100];
  REP(i, N) cin >> w[i] >> v[i];

  // dp[n][w] ... n番目(1-index)までの品物の中で、合計w以下としたときの最大価値
  static int dp[100][100000];

  // 貰うdp
  for (int i = 1; i <= N; i++) {
    for (int j = 0; j <= W; j++) {
      // i番目を選ばない場合
      chmax(dp[i][j], dp[i - 1][j]);

      // i番目を選ぶ場合
      if (j - w[i - 1] >= 0)
        chmax(dp[i][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
    }
  }

  cout << dp[N][W] << endl;

  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#if 1
#define int long long
#define MAX LLONG_MAX
#define MIN LLONG_MIN
#define stoi stoll
#else
#define MAX INT_MAX
#define MIN INT_MIN
#endif
#define INF MAX / 2
#define ALL(obj) (obj).begin(), (obj).end()
#define fi first
#define se second
const int NIL = -1;
const int MOD = 1000000007;
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
using namespace std;

int pow(int x, int n) {
  int res = 1;
  while (n) {
    if (n & 1)
      res *= x;
    x *= x;
    n >>= 1;
  }
  return res;
}
int get_gcd(int a, int b) {
  while (1) {
    if (a < b)
      swap(a, b);
    if (b == 0)
      return a;
    a %= b;
  }
}
int get_lcm(int a, int b) { return a * b / get_gcd(a, b); }
bool chmin(int &a, int b) {
  if (a > b) {
    a = b;
    return true;
  } else
    return false;
}
bool chmax(int &a, int b) {
  if (a < b) {
    a = b;
    return true;
  } else
    return false;
}
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};

//-------------------------テンプレここまで-------------------------//

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);

  int N, W;
  cin >> N >> W;
  static int w[100], v[100];
  REP(i, N) cin >> w[i] >> v[i];

  // dp[n][w] ... n番目(1-index)までの品物の中で、合計w以下としたときの最大価値
  static int dp[101][100001];

  // 貰うdp
  for (int i = 1; i <= N; i++) {
    for (int j = 0; j <= W; j++) {
      // i番目を選ばない場合
      chmax(dp[i][j], dp[i - 1][j]);

      // i番目を選ぶ場合
      if (j - w[i - 1] >= 0)
        chmax(dp[i][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
    }
  }

  cout << dp[N][W] << endl;

  return 0;
}