Problem p03164 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define ri(x) scanf("%d", &(x))
#define ri2(x, y) scanf("%d %d", &(x), &(y))
#define ri3(x, y, z) scanf("%d %d %d", &(x), &(y), &(z))
#define rll(x) scanf("%lld", &(x))
#define rll2(x, y) scanf("%lld %lld", &(x), &(y))
#define rll3(x, y, z) scanf("%lld %lld %lld", &(x), &(y), &(z))
#define gc(x) ((x) = getchar())
using namespace ::std;

const long double PI = acos(-1);
const long long MOD = 1000000000 + 7;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, pll> tll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<pll> vpll;
typedef vector<tll> vtll;
typedef vector<string> vs;
typedef set<int> si;
typedef set<ii> sii;
typedef set<iii> siii;

ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }

ll add(ll a, ll b, ll m = MOD) { return (a % m + b % m + 2 * m) % m; }

ll mul(ll a, ll b, ll m = MOD) { return ((a % m + m) * (b % m + m)) % m; }

ll pow_mod(ll a, ll b, ll m = MOD) {
  ll res = 1LL;
  a = a % m;
  while (b) {
    if (b & 1)
      res = mul(res, a, m);
    b >>= 1;
    a = mul(a, a, m);
  }
  return res;
}

ll fastexp(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a;
    b >>= 1;
    a *= a;
  }
  return res;
}

int gcdExtendido(int a, int b, int *x, int *y) {
  if (a == 0) {
    *x = 0;
    *y = 1;
    return b;
  }
  int x1, y1;
  int gcd = gcdExtendido(b % a, a, &x1, &y1);

  *x = y1 - (b / a) * x1;
  *y = x1;
  return gcd;
}

int modInverso(int a, int m) {
  int x, y;
  int g = gcdExtendido(a, m, &x, &y);
  if (g != 1)
    return -1;
  else
    return (x % m + m) % m;
}

/****************************************
*************P*L*A*N*T*I*L*L*A************
*****************************************/

const int N = 100 + 5;
const int V = 10000 + 5;
const ll inf = 1LL << 60;

int n;
int C;
int w[N];
int v[N];
ll memo[N][V];

int main() {
  ri2(n, C);
  int S = 0;
  for (int i = 1; i <= n; i++) {
    ri2(w[i], v[i]);
    S += v[i];
  }
  for (int i = 0; i <= S; i++)
    memo[0][i] = inf;
  memo[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= S; j++) {
      memo[i][j] = memo[i - 1][j];
      if (j >= v[i]) {
        if (memo[i - 1][j - v[i]] + w[i] <= C) {
          memo[i][j] = min(memo[i][j], memo[i - 1][j - v[i]] + w[i]);
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i <= S; i++) {
    if (memo[n][i] <= C) {
      ans = i;
    }
  }
  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define all(v) (v).begin(), (v).end()
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define ri(x) scanf("%d", &(x))
#define ri2(x, y) scanf("%d %d", &(x), &(y))
#define ri3(x, y, z) scanf("%d %d %d", &(x), &(y), &(z))
#define rll(x) scanf("%lld", &(x))
#define rll2(x, y) scanf("%lld %lld", &(x), &(y))
#define rll3(x, y, z) scanf("%lld %lld %lld", &(x), &(y), &(z))
#define gc(x) ((x) = getchar())
using namespace ::std;

const long double PI = acos(-1);
const long long MOD = 1000000000 + 7;

typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<ll, pll> tll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<pll> vpll;
typedef vector<tll> vtll;
typedef vector<string> vs;
typedef set<int> si;
typedef set<ii> sii;
typedef set<iii> siii;

ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); }

ll add(ll a, ll b, ll m = MOD) { return (a % m + b % m + 2 * m) % m; }

ll mul(ll a, ll b, ll m = MOD) { return ((a % m + m) * (b % m + m)) % m; }

ll pow_mod(ll a, ll b, ll m = MOD) {
  ll res = 1LL;
  a = a % m;
  while (b) {
    if (b & 1)
      res = mul(res, a, m);
    b >>= 1;
    a = mul(a, a, m);
  }
  return res;
}

ll fastexp(ll a, ll b) {
  ll res = 1LL;
  while (b) {
    if (b & 1)
      res = res * a;
    b >>= 1;
    a *= a;
  }
  return res;
}

int gcdExtendido(int a, int b, int *x, int *y) {
  if (a == 0) {
    *x = 0;
    *y = 1;
    return b;
  }
  int x1, y1;
  int gcd = gcdExtendido(b % a, a, &x1, &y1);

  *x = y1 - (b / a) * x1;
  *y = x1;
  return gcd;
}

int modInverso(int a, int m) {
  int x, y;
  int g = gcdExtendido(a, m, &x, &y);
  if (g != 1)
    return -1;
  else
    return (x % m + m) % m;
}

/****************************************
*************P*L*A*N*T*I*L*L*A************
*****************************************/

const int N = 100 + 5;
const int V = 100000 + 5;
const ll inf = 1LL << 60;

int n;
int C;
int w[N];
int v[N];
ll memo[N][V];

int main() {
  ri2(n, C);
  int S = 0;
  for (int i = 1; i <= n; i++) {
    ri2(w[i], v[i]);
    S += v[i];
  }
  for (int i = 0; i <= S; i++)
    memo[0][i] = inf;
  memo[0][0] = 0;
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j <= S; j++) {
      memo[i][j] = memo[i - 1][j];
      if (j >= v[i]) {
        if (memo[i - 1][j - v[i]] + w[i] <= C) {
          memo[i][j] = min(memo[i][j], memo[i - 1][j - v[i]] + w[i]);
        }
      }
    }
  }
  int ans = 0;
  for (int i = 0; i <= S; i++) {
    if (memo[n][i] <= C) {
      ans = i;
    }
  }
  cout << ans << endl;
  return 0;
}