Submission #1286538

#TimeUsernameProblemLanguageResultExecution timeMemory
1286538ducmanh2612Knapsack (NOI18_knapsack)C++20
100 / 100
854 ms8356 KiB
#include <bits/stdc++.h> using namespace std; struct Item {long long V,W,K;}; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int S,N; cin >> S >> N; vector<Item> items(N); for (auto &it : items) cin >> it.V >> it.W >> it.K; // Bỏ vật vô dụng vector<Item> useful; useful.reserve(N); for (auto &it: items) if (it.V>0 && it.W>0 && it.W<=S && it.K>0) useful.push_back(it); swap(items,useful); // Gộp vật trùng (W,V) sort(items.begin(), items.end(), [](auto &a, auto &b){ if (a.W!=b.W) return a.W<b.W; return a.V<b.V; }); vector<Item> merged; for (auto &it: items) { if (!merged.empty() && merged.back().W==it.W && merged.back().V==it.V) merged.back().K += it.K; else merged.push_back(it); } swap(items, merged); vector<long long> dp(S+1,0); for (auto &it: items) { long long V=it.V, W=it.W, K=it.K; if (K*W>=S) { for (int s=W; s<=S; ++s) if (dp[s-W]+V>dp[s]) dp[s]=dp[s-W]+V; } else { long long remain=K, t=1; while (remain>0) { long long num=min(t,remain); int wt=int(num*W); long long val=num*V; for (int s=S; s>=wt; --s) if (dp[s-wt]+val>dp[s]) dp[s]=dp[s-wt]+val; remain-=num; t<<=1; } } } cout << *max_element(dp.begin(), dp.end()) << "\n"; }
#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...