제출 #938886

#제출 시각아이디문제언어결과실행 시간메모리
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...