Submission #1307098

#TimeUsernameProblemLanguageResultExecution timeMemory
1307098888313666Knapsack (NOI18_knapsack)C++20
100 / 100
78 ms3336 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; signed main(){ ll c,n; cin>>c>>n; vector<ll> dp(c+1, 0); vector<vector<array<ll, 2>>> p(c+1); for (int i=0; i<n; i++){ ll v,w,k; cin>>v>>w>>k; p[w].push_back({v, k}); } //cout<<'a'<<endl; for (int i=1; i<=c; i++) sort(p[i].rbegin(), p[i].rend()); //cout<<'b'<<endl; for (int i=1; i<=c; i++){ //cout<<'c'<<endl; if (p[i].empty()) continue; ll s=c/i; for (const auto [v, k]:p[i]){ //cout<<'d'<<endl; auto r=min(k, s); assert(r); const auto lg=63-__builtin_clzll(r+1); for (int j=0; j<lg; j++){ for (int m=c; m>=i<<j; --m){ dp[m]=max(dp[m], dp[m-(i<<j)]+(v<<j)); } r-=1<<j; } //cout<<'e'<<endl; //cout<<r<<' '<<i<<endl; if (r) for (int j=c; j>=i*r; --j) dp[j]=max(dp[j], dp[j-i*r]+r*v); s-=k; if (s<=0) break; //cout<<'f'<<endl; } } cout<<dp.back()<<'\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...