Submission #1196268

#TimeUsernameProblemLanguageResultExecution timeMemory
1196268a0ms1nKnapsack (NOI18_knapsack)C++20
17 / 100
2 ms328 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int n; // W -> V // Weight i can have S/i items (Greedy by choose most value first (remove min value if exceeds)) // = S + S/2 + S/3 + ... S/S -> Sln(S); priority_queue<int,vector<int>,greater<int>> prod[2020]; int dp[(int)2001]={0}; vector<pair<int,int>> V; /* dp[n][w] = max(dp[n-1][w],dp[n-1][w-W]+V) */ signed main(){ int s,n;cin>>s>>n; for(int i=0;i<n;i++){ int V,W,K;cin>>V>>W>>K; for(int w=W,k=1;k<=K && w<=s;k++,w+=W){ //cout<<w<<' '<<V*k<<'\n'; prod[w].push(V*k); if(prod[w].size() > s/w + 20)prod[w].pop(); } } for(int i=0;i<=s;i++){ while(prod[i].size())V.push_back({i,prod[i].top()}),prod[i].pop(); } n = V.size(); for(int i=0;i<n;i++){ //cout<<V[i].first<<' '<<V[i].second<<'\n'; for(int j=s;j>=V[i].first;j--){ dp[j] = max(dp[j],dp[j-V[i].first]+V[i].second); } } cout<<dp[s]; 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...