1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include<bits/stdc++.h> using namespace std; int dp[100001],v,n[1000001],vl[1000001],ct[1000001]; void lingyi(int cost,int value){ for(i=v;i>=cost;i--){ dp[i]=max(dp[i],dp[i-cost]+value); } } void wanquan(int cost,int value){ for(i=cost;i<=v;i++){ dp[i]=max(dp[i],dp[i-cost]+value); } } void duochong(int cost,int value,int num){ int k; if(num*cost>=v){ wanquan(cost,value); } else{ k=1; while(num>k){ lingyi(k*cost,k*value); num-=k; k*=2; } lingyi(num*cost,num*value); } } int main(){ int c,m,i; cin>>c; while(c--){ cin>>v>>m; for(i=1;i<=m;i++){ cin>>vl[i]>>ct[i]>>n[i]; } memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++){ duochong(vl[i],ct[i],n[i]); } cout<<dp[v]<<endl; } return 0; }
|