Problem p03164 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define VRSORT(v) sort(v.begin(), v.end(), greater<int>());
#define INF 999999999
#define MOD 1000000007
#define M_PI 3.14159265358979323846
#define ALL(X) (X).begin(), (X).end()

#ifdef __LOCAL
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

#ifdef __LOCAL
#include <filesystem>
namespace fs = std::filesystem;
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 0};
int dy[] = {0, 1, 0, -1, 0};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);
const int NIL = -1;
static mt19937 _g(time(nullptr));

std::string pad(int num) {
  char buffer[4];
  std::snprintf(buffer, sizeof(buffer), "%03d", num);
  return buffer;
}
inline ll randint(ll a, ll b) {
  ll w = (_g() << 31LL) ^ _g();
  return a + w % (b - a + 1);
}
inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline T fetch() {
  T ret;
  cin >> ret;
  return ret;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

int N, Wmax;
vector<ll> V, W;

void input() {
#ifdef __LOCAL
  fs::path p = __FILE__;
  fs::path input, output;
  input = output = p.parent_path();
  input += string("/input/") + string(p.stem()) + string(".txt");
  output += string("/output/") + string(p.stem()) + string(".txt");
  freopen(input.c_str(), "r", stdin);
  freopen(output.c_str(), "w", stdout);
#endif
  cin >> N >> Wmax;
  for (int i = 0; i < N; i++) {
    ll v, w;
    cin >> w >> v;
    W.push_back(w);
    V.push_back(v);
  }
}

// dp[i][v]:=
// i個目までの品物からいくつかを選び価値の合計がvであるときの重さの合計の最小値
int solve() {
  vector<map<int, ll>> dp(N + 1);
  int Vmax = accumulate(ALL(V), 0);
  dp[0].emplace(0, 0);
  for (int i = 1; i <= N; i++) {
    for (auto const &vw : dp[i - 1]) {
      if (vw.second > Wmax)
        continue;
      dp[i][vw.first] =
          (dp[i][vw.first] == 0) ? vw.second : min(dp[i][vw.first], vw.second);
      if (vw.second + W[i - 1] > Wmax)
        continue;
      dp[i][vw.first + V[i - 1]] =
          (dp[i][vw.first + V[i - 1]] == 0)
              ? vw.second + W[i - 1]
              : min(dp[i][vw.first + V[i - 1]], vw.second + W[i - 1]);
    }
    // TLE
    // for (int j = 0; j <= Vmax; j++)
    // {
    //   // if(dp[i-1][j]==0 && dp[i-1][j-V[i-1]]==0) continue;
    //   // if(dp[i-1][j-V[i-1]]==0) {dp[i][j] = dp[i-1][j]; continue;}
    //   // if(dp[i-1][j]==0) {dp[i][j] = dp[i-1][j-V[i-1]]+W[i-1]; continue;}
    //   // else dp[i][j] = min(dp[i-1][j],dp[i-1][j-V[i-1]]+W[i-1]);
    // }
  }

  // int ans=0;
  // for (int j=Vmax;j>0;j--)
  // {
  //   if(dp[N][j]==0) continue;
  //   // if(v.second <= Wmax) ans = max(ans,v.first);
  //   cout << j << endl;
  //   return 0;
  // }

  auto pr = std::max_element(
      std::begin(dp[N]), std::end(dp[N]),
      [](const auto &p1, const auto &p2) { return p1.first < p2.first; });
  cout << pr->first << endl;

  // for (auto const &v:dp[N])
  // {
  //   // if(dp[N][j]==0) continue;
  //   // if(v.second <= Wmax) ans = max(ans,v.first);
  //   ans = max(ans,v.first);
  // }

  // cout << ans << endl;
  return 0;
}

int main() {
  input();
  solve();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define VRSORT(v) sort(v.begin(), v.end(), greater<int>());
#define INF 999999999
#define MOD 1000000007
#define M_PI 3.14159265358979323846
#define ALL(X) (X).begin(), (X).end()

#ifdef __LOCAL
#define DBG(X) cout << #X << " = " << (X) << endl;
#define SAY(X) cout << (X) << endl;
#else
#define DBG(X)
#define SAY(X)
#endif

#ifdef __LOCAL
#include <filesystem>
namespace fs = std::filesystem;
#endif

using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

int dx[] = {1, 0, -1, 0, 0};
int dy[] = {0, 1, 0, -1, 0};
const int INT_INF = (int)(2e9);
const ll LL_INF = (ll)(2e18);
const int NIL = -1;
static mt19937 _g(time(nullptr));

std::string pad(int num) {
  char buffer[4];
  std::snprintf(buffer, sizeof(buffer), "%03d", num);
  return buffer;
}
inline ll randint(ll a, ll b) {
  ll w = (_g() << 31LL) ^ _g();
  return a + w % (b - a + 1);
}
inline void fast_io() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
};
template <typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template <typename T, typename S>
inline ostream &operator<<(ostream &os, const pair<T, S> p) {
  cout << "[" << p.first << ";" << p.second << "]";
  return os;
}
template <typename T>
inline ostream &operator<<(ostream &os, const vector<T> &v) {
  for (auto el : v)
    cout << el << " ";
  return os;
}
template <typename T> inline T fetch() {
  T ret;
  cin >> ret;
  return ret;
}
template <typename T> inline vector<T> fetch_vec(int sz) {
  vector<T> ret(sz);
  for (auto &elem : ret)
    cin >> elem;
  return ret;
}

int N, Wmax;
vector<ll> V, W;

void input() {
#ifdef __LOCAL
  fs::path p = __FILE__;
  fs::path input, output;
  input = output = p.parent_path();
  input += string("/input/") + string(p.stem()) + string(".txt");
  output += string("/output/") + string(p.stem()) + string(".txt");
  freopen(input.c_str(), "r", stdin);
  freopen(output.c_str(), "w", stdout);
#endif
  cin >> N >> Wmax;
  for (int i = 0; i < N; i++) {
    ll v, w;
    cin >> w >> v;
    W.push_back(w);
    V.push_back(v);
  }
}

// dp[i][v]:=
// i個目までの品物からいくつかを選び価値の合計がvであるときの重さの合計の最小値
int solve() {
  vector<map<int, ll>> dp(N + 1);
  int Vmax = accumulate(ALL(V), 0);
  dp[0].emplace(0, 0);
  for (int i = 1; i <= N; i++) {
    for (auto const &vw : dp[i - 1]) {
      if (vw.second > Wmax)
        continue;
      dp[i][vw.first] =
          (dp[i][vw.first] == 0) ? vw.second : min(dp[i][vw.first], vw.second);
      if (vw.second + W[i - 1] > Wmax)
        continue;
      dp[i][vw.first + V[i - 1]] =
          (dp[i][vw.first + V[i - 1]] == 0)
              ? vw.second + W[i - 1]
              : min(dp[i][vw.first + V[i - 1]], vw.second + W[i - 1]);
    }
    dp[i - 1].clear();
    // TLE
    // for (int j = 0; j <= Vmax; j++)
    // {
    //   // if(dp[i-1][j]==0 && dp[i-1][j-V[i-1]]==0) continue;
    //   // if(dp[i-1][j-V[i-1]]==0) {dp[i][j] = dp[i-1][j]; continue;}
    //   // if(dp[i-1][j]==0) {dp[i][j] = dp[i-1][j-V[i-1]]+W[i-1]; continue;}
    //   // else dp[i][j] = min(dp[i-1][j],dp[i-1][j-V[i-1]]+W[i-1]);
    // }
  }

  // int ans=0;
  // for (int j=Vmax;j>0;j--)
  // {
  //   if(dp[N][j]==0) continue;
  //   // if(v.second <= Wmax) ans = max(ans,v.first);
  //   cout << j << endl;
  //   return 0;
  // }

  auto pr = std::max_element(
      std::begin(dp[N]), std::end(dp[N]),
      [](const auto &p1, const auto &p2) { return p1.first < p2.first; });
  cout << pr->first << endl;

  // for (auto const &v:dp[N])
  // {
  //   // if(dp[N][j]==0) continue;
  //   // if(v.second <= Wmax) ans = max(ans,v.first);
  //   ans = max(ans,v.first);
  // }

  // cout << ans << endl;
  return 0;
}

int main() {
  input();
  solve();
  return 0;
}