Submission #1314126

#TimeUsernameProblemLanguageResultExecution timeMemory
1314126nambanana987Knapsack (NOI18_knapsack)C++20
73 / 100
328 ms327680 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; int s, n; vector<pair<int,int>> W[2005]; int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cin >> s >> n; for(int i = 1; i <= n; i++){ int v, w, k; cin >> v >> w >> k; if(w <= s && k > 0) W[w].push_back({v, k}); } vector<ll> dp(s+1, 0); // duyệt theo trọng lượng for(int w = 1; w <= s; w++){ if(W[w].empty()) continue; // lấy các value, tối đa S / w món vector<int> vals; for(auto &[v, k] : W[w]){ int take = min(k, s / w); while(take--) vals.push_back(v); } if(vals.empty()) continue; sort(vals.begin(), vals.end(), greater<int>()); int m = vals.size(); vector<ll> pre(m+1, 0); for(int i = 0; i < m; i++) pre[i+1] = pre[i] + vals[i]; vector<ll> new_dp = dp; // group knapsack for(int t = 1; t <= m; t++){ int weight = t * w; if(weight > s) break; for(int x = weight; x <= s; x++){ new_dp[x] = max(new_dp[x], dp[x - weight] + pre[t]); } } dp.swap(new_dp); } cout << *max_element(dp.begin(), dp.end()); 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...