Submission #1273615

#TimeUsernameProblemLanguageResultExecution timeMemory
127361544100Knapsack (NOI18_knapsack)C++20
100 / 100
116 ms6024 KiB
#include <bits/stdc++.h> #define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define pub push_back #define pob pop_back #define fi first #define se second using namespace std; typedef long long ll; typedef pair<ll,ll> pll; const ll Max=1e5+5,D=2e3+5; ll W,n; ll dp[Max],app[Max],c[Max],w[Max]; void sub1() { ll i,j,k,cnt,ans; cnt=min(W/w[1],app[1]); ans=c[1]*cnt; cout<<ans; return; } void sub234() { ll i,j,k,cnt,ans; for(i=1;i<=n;++i) { cnt=min(W/w[i],app[i]); for(k=1;k<=cnt;++k) { for(j=W;j>=w[i];--j) dp[j]=max(dp[j],dp[j-w[i]]+c[i]); } } /*for(i=1;i<=n;++i) cout<<dp[i]<<" "; cout<<"\n";*/ cout<<dp[W]; return; } void sub5() { ///Nhận thấy với mỗi w[i] thì chỉ lấy tối đa được W/w[i] đồ như vậy, áp dụng ý tưởng này + tham lam: sort sao cho cùng w[i] thì c[i] max, sau đó làm tương tự sub 2,3,4, chú ý biến đổi app[i] theo từng lượt for ll i,j,k,cnt,ans,id; vector<pll> Do[D]; for(i=1;i<=n;++i) { if(w[i]>W) continue; Do[w[i]].pub({c[i],app[i]}); } for(i=0;i<=W;++i) { if(Do[i].empty()) continue; sort(Do[i].begin(),Do[i].end(),greater<pll>()); id=0; for(k=0;k*i<W;++k) { if(id>=Do[i].size()) break; for(j=W;j>=i;--j) dp[j]=max(dp[j],dp[j-i]+Do[i][id].fi); --Do[i][id].se; if(!Do[i][id].se) ++id; } } cout<<dp[W]; return; } int main() { fast memset(dp,0,sizeof(dp)); ll i,j,k,cnt,ans; cin>>W>>n; for(i=1;i<=n;++i) cin>>c[i]>>w[i]>>app[i]; if(n==1) { sub1(); return 0; } if(n<=100) { sub234(); return 0; } sub5(); 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...