제출 #1307061

#제출 시각아이디문제언어결과실행 시간메모리
1307061supersonicman12Knapsack (NOI18_knapsack)C++20
100 / 100
75 ms1708 KiB
#include <bits/stdc++.h> using namespace std; const int NINF = -1e9; int S, n; // pair<val, qty> O[weight] int dp[2005]; priority_queue<pair<int,int>> O[2005]; int main(){ cin >> S >> n; for (int i = 1; i <= S; i++) dp[i] = NINF; for (int i = 1; i <= n; i++){ int v, w, k; cin >> v >> w >> k; O[w].push({v, k}); } for (int w = 1; w <= 2000; w++){ if (O[w].empty()) continue; int fit = S/w; while (!O[w].empty()){ auto [v, k] = O[w].top(); O[w].pop(); int x = min(fit, k); for (int bit = 1; x >= bit; bit<<=1){ for (int i = S; i >= w*bit; i--){ dp[i] = max(dp[i-w*bit]+v*bit, dp[i]); } x -= bit; } if (x != 0){ for (int i = S; i >= w*x; i--){ dp[i] = max(dp[i-w*x]+v*x, dp[i]); } } if (fit <= k) break; fit -= k; } } int ans = 0; for (int i = 1; i <= S; i++){ ans = max(dp[i], ans); } cout << ans << endl; 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...