Problem p03536 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ii, ii> iii;
int MOD = 10;
const ld E = 1e-9;
#define null NULL
#define ms(x) memset(x, 0, sizeof(x))
#ifndef LOCAL
#define endl "\n"
#endif
#ifndef LONG_LONG_MAX
#define LONG_LONG_MAX LLONG_MAX
#endif
#define sync                                                                   \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define _read(x) freopen(x, "r", stdin)
#define _write(x) freopen(x, "w", stdout)
#define files(x)                                                               \
  _read(x ".in");                                                              \
  _write(x ".out")
#define filesdatsol(x)                                                         \
  _read(x ".DAT");                                                             \
  _write(x ".SOL")
#define output _write("output.txt")
#define input _read("input.txt")
#define prev time_prev
#ifndef M_PI
#define M_PI acos(-1)
#endif
#define remove tipa_remove
#define next tipa_next
#define left tipa_left
#define right tipa_right
#define mod % MOD
#define y1 hello_world
unsigned char ccc;
bool _minus = false;
template <typename T> inline T sqr(T t) { return (t * t); }
inline void read(ll &n) {
  n = 0;
  _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n')
      break;
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus)
    n *= -1;
}
inline bool read(int &n) {
  n = 0;
  _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n') {
      if (ccc == '\n')
        return true;
      break;
    }
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus)
    n *= -1;
  return false;
}
char wwww[19];
int kkkk;
inline void write(ll y) {
  long long x = y;
  kkkk = 0;
  if (x < 0) {
    putchar('-');
    x *= -1;
  }
  if (!x)
    ++kkkk, wwww[kkkk] = '0';
  else
    while (x) {
      ++kkkk;
      wwww[kkkk] = char(x % 10 + '0');
      x /= 10;
    }
  for (int i = kkkk; i >= 1; --i)
    putchar(wwww[i]);
}
#ifdef LOCAL
#define DEBUG
#endif
#ifdef DEBUG
#define dbg if (1)
#else
#define dbg if (0)
#endif

bool cmp(pair<int, int> a, pair<int, int> b) {
  if (a.first + a.second != b.first + b.second) {
    return a.first + a.second < b.first + b.second;
  } else {
    return a.first < b.first;
  }
}

ll dp[5002];

ll solve(vector<pair<int, int>> &v) {
  dp[0] = 0;
  int ans = 0;
  for (int i = 1; i <= (int)v.size() + 1; i++) {
    dp[i] = 1e18;
  }
  for (int j = 0; j < (int)v.size(); j++) {
    for (int i = ans; i >= 0; i--) {
      if (dp[i] < 1e18 && dp[i] <= v[j].first) {
        dp[i + 1] = min(dp[i + 1], dp[i] + v[j].second);
      }
      while (dp[ans + 1] < 1e18) {
        ans++;
      }
    }
  }
  return ans;
}

ll solve_ok(vector<pair<int, int>> v) {
  sort(v.begin(), v.end(), cmp);
  return solve(v);
}

ll solve_long(vector<pair<int, int>> v) {
  int n = (int)v.size();
  vector<int> t(n);
  for (int i = 0; i < n; i++) {
    t[i] = i;
  }
  ll ans = 0;
  do {
    vector<pair<int, int>> e;
    for (int i : t) {
      e.push_back(v[i]);
    }
    ans = max(ans, solve(e));
  } while (next_permutation(t.begin(), t.end()));
  return ans;
}

int main() {
  sync;
  srand(time(NULL));
  cout.precision(10);
  cout << fixed;
#ifdef LOCAL
  input;
#else

#endif

  int n;
  cin >> n;

  vector<pair<int, int>> vec(n);
  for (int i = 0; i < n; i++) {
    cin >> vec[i].first >> vec[i].second;
  }

  cout << solve_long(vec) << endl;
}


Fixed submission:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/detail/standard_policies.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/rope>
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
typedef long long ll;
typedef unsigned long long ull;
typedef unsigned int ui;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ii, ii> iii;
int MOD = 10;
const ld E = 1e-9;
#define null NULL
#define ms(x) memset(x, 0, sizeof(x))
#ifndef LOCAL
#define endl "\n"
#endif
#ifndef LONG_LONG_MAX
#define LONG_LONG_MAX LLONG_MAX
#endif
#define sync                                                                   \
  ios_base::sync_with_stdio(0);                                                \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define _read(x) freopen(x, "r", stdin)
#define _write(x) freopen(x, "w", stdout)
#define files(x)                                                               \
  _read(x ".in");                                                              \
  _write(x ".out")
#define filesdatsol(x)                                                         \
  _read(x ".DAT");                                                             \
  _write(x ".SOL")
#define output _write("output.txt")
#define input _read("input.txt")
#define prev time_prev
#ifndef M_PI
#define M_PI acos(-1)
#endif
#define remove tipa_remove
#define next tipa_next
#define left tipa_left
#define right tipa_right
#define mod % MOD
#define y1 hello_world
unsigned char ccc;
bool _minus = false;
template <typename T> inline T sqr(T t) { return (t * t); }
inline void read(ll &n) {
  n = 0;
  _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n')
      break;
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus)
    n *= -1;
}
inline bool read(int &n) {
  n = 0;
  _minus = false;
  while (true) {
    ccc = getchar();
    if (ccc == ' ' || ccc == '\n') {
      if (ccc == '\n')
        return true;
      break;
    }
    if (ccc == '-') {
      _minus = true;
      continue;
    }
    n = n * 10 + ccc - '0';
  }
  if (_minus)
    n *= -1;
  return false;
}
char wwww[19];
int kkkk;
inline void write(ll y) {
  long long x = y;
  kkkk = 0;
  if (x < 0) {
    putchar('-');
    x *= -1;
  }
  if (!x)
    ++kkkk, wwww[kkkk] = '0';
  else
    while (x) {
      ++kkkk;
      wwww[kkkk] = char(x % 10 + '0');
      x /= 10;
    }
  for (int i = kkkk; i >= 1; --i)
    putchar(wwww[i]);
}
#ifdef LOCAL
#define DEBUG
#endif
#ifdef DEBUG
#define dbg if (1)
#else
#define dbg if (0)
#endif

bool cmp(pair<int, int> a, pair<int, int> b) {
  if (a.first + a.second != b.first + b.second) {
    return a.first + a.second < b.first + b.second;
  } else {
    return a.first < b.first;
  }
}

ll dp[5002];

ll solve(vector<pair<int, int>> &v) {
  dp[0] = 0;
  int ans = 0;
  for (int i = 1; i <= (int)v.size() + 1; i++) {
    dp[i] = 1e18;
  }
  for (int j = 0; j < (int)v.size(); j++) {
    for (int i = ans; i >= 0; i--) {
      if (dp[i] < 1e18 && dp[i] <= v[j].first) {
        dp[i + 1] = min(dp[i + 1], dp[i] + v[j].second);
      }
      while (dp[ans + 1] < 1e18) {
        ans++;
      }
    }
  }
  return ans;
}

ll solve_ok(vector<pair<int, int>> v) {
  sort(v.begin(), v.end(), cmp);
  return solve(v);
}

ll solve_long(vector<pair<int, int>> v) {
  int n = (int)v.size();
  vector<int> t(n);
  for (int i = 0; i < n; i++) {
    t[i] = i;
  }
  ll ans = 0;
  do {
    vector<pair<int, int>> e;
    for (int i : t) {
      e.push_back(v[i]);
    }
    ans = max(ans, solve(e));
  } while (next_permutation(t.begin(), t.end()));
  return ans;
}

int main() {
  sync;
  srand(time(NULL));
  cout.precision(10);
  cout << fixed;
#ifdef LOCAL
  input;
#else

#endif

  int n;
  cin >> n;

  vector<pair<int, int>> vec(n);
  for (int i = 0; i < n; i++) {
    cin >> vec[i].first >> vec[i].second;
  }

  cout << solve_ok(vec) << endl;
}