Submission #938886

#TimeUsernameProblemLanguageResultExecution timeMemory
938886myst6Knapsack (NOI18_knapsack)C++14
100 / 100
173 ms2908 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

signed main() {
  cin.tie(0)->sync_with_stdio(0);
  int S, N;
  cin >> S >> N;
  vector<int> dp(S+1);
  // for each weight w from 1 <= 2000
  // only need the best 2000/w items
  vector<priority_queue<pair<int,int>>> best(S+1);
  for (int i=0; i<N; i++) {
    int V, W, K;
    cin >> V >> W >> K;
    best[W].push({V, K});
  }
  for (int W=1; W<=S; W++) {
    int ct = S / W;
    while (best[W].size() && ct-- >= 0) {
      pair<int,int> VK = best[W].top();
      best[W].pop();
      int V = VK.first;
      int K = VK.second;
      for (int j=0; K>0; j++) {
        int v = V << j;
        int w = W << j;
        for (int k=S-w; k>=0; k--) {
          dp[k+w] = max(dp[k+w], dp[k]+v);
        }
        K -= 1 << j;
        if (K & (1 << j)) {
          for (int k=S-w; k>=0; k--) {
            dp[k+w] = max(dp[k+w], dp[k]+v);
          }
          K -= 1 << j;
        }
      }
    }
  }
  cout << dp[S] << "\n";
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...