Problem p03164 (C++)

Buggy submission (status: Time Limit Exceeded):
/*
ID: seekho
PROG: friday
LANG: C++14
*/
/* LANG can be C++11 or C++14 for those more recent releases */

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update

using namespace std;
using namespace __gnu_pbds;

// find_by_order gives kth-largest element
// order_of_key gives the number of items in the set that are strictly smaller!!

// OT.find_by_order(k-1)
//
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;

#define db(x) cerr << #x << "=" << x << endl
#define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl
#define db3(x, y, z)                                                           \
  cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z     \
       << endl
#define db4(x, y, z, w)                                                        \
  cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z     \
       << "," << #w << "=" << w << endl
#define ll long long
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define mp make_pair
#define X first
#define Y second
#define sz(x) (int)((x).size())
#define pii pair<int, int>
#define MOD (ll)(998244353)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repA(i, a, n) for (int i = a; i <= (n); ++i)
#define repD(i, a, n) for (int i = a; i >= (n); --i)
#define trav(a, x) for (auto &a : x)
typedef vector<int> vi;
#define inf (ll)(1e18)
#define double long double
#define int long long

//////////////////////
const int N = 100005;

int n, w;
int wt[101];
int val[101];
int memo[101][N];

int go(int ind, int value) {
  if (value < 0)
    return -1;
  if (ind >= n and value != 0)
    return -1;
  else if (ind >= n)
    return w;

  if (memo[ind][value] != -inf)
    return memo[ind][value];

  rep(i, N) {
    if (go(ind + 1, value - val[ind]) - wt[ind] >= 0) {
      memo[ind][value] =
          max(go(ind + 1, value - val[ind]) - wt[ind], go(ind + 1, value));
    } else
      memo[ind][value] = -1;
  }
  return memo[ind][value];
}

int32_t main() {

  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  cin >> n >> w;
  rep(i, n) cin >> wt[i] >> val[i];

  rep(i, n) { rep(j, N) memo[i][j] = -inf; }

  repD(i, N - 1, 0) {
    if (go(0, i) >= 0) {
      cout << i << '\n';
      return 0;
    }
  }
}

Fixed submission:
/*
ID: seekho
PROG: friday
LANG: C++14
*/
/* LANG can be C++11 or C++14 for those more recent releases */

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> // Common file
#include <ext/pb_ds/tree_policy.hpp> // Including tree_order_statistics_node_update

using namespace std;
using namespace __gnu_pbds;

// find_by_order gives kth-largest element
// order_of_key gives the number of items in the set that are strictly smaller!!

// OT.find_by_order(k-1)
//
typedef tree<int, null_type, less<int>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;

#define db(x) cerr << #x << "=" << x << endl
#define db2(x, y) cerr << #x << "=" << x << "," << #y << "=" << y << endl
#define db3(x, y, z)                                                           \
  cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z     \
       << endl
#define db4(x, y, z, w)                                                        \
  cerr << #x << "=" << x << "," << #y << "=" << y << "," << #z << "=" << z     \
       << "," << #w << "=" << w << endl
#define ll long long
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define mp make_pair
#define X first
#define Y second
#define sz(x) (int)((x).size())
#define pii pair<int, int>
#define MOD (ll)(998244353)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define repA(i, a, n) for (int i = a; i <= (n); ++i)
#define repD(i, a, n) for (int i = a; i >= (n); --i)
#define trav(a, x) for (auto &a : x)
typedef vector<int> vi;
#define inf (ll)(1e18)
#define double long double
#define int long long

//////////////////////
const int N = 100005;

int n, w;
int wt[101];
int val[101];
int memo[101][N];

int go(int ind, int value) {
  if (value < 0)
    return -1;
  if (ind >= n and value != 0)
    return -1;
  else if (ind >= n)
    return w;

  if (memo[ind][value] != -inf)
    return memo[ind][value];

  // rep(i,N) {
  if (go(ind + 1, value - val[ind]) - wt[ind] >= 0) {
    memo[ind][value] =
        max(go(ind + 1, value - val[ind]) - wt[ind], go(ind + 1, value));
  } else
    memo[ind][value] = go(ind + 1, value);
  // }
  return memo[ind][value];
}

int32_t main() {

  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  cin >> n >> w;
  rep(i, n) cin >> wt[i] >> val[i];

  rep(i, n) { rep(j, N) memo[i][j] = -inf; }

  repD(i, N - 1, 0) {
    if (go(0, i) >= 0) {
      cout << i << '\n';
      return 0;
    }
  }
}