- Input
输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。
- Output
对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。
Sample Input
1
8 2
2 100 4
4 100 2
Sample Output
400
与01完全背包不同的是这个多了 个 能选几袋以内
1 int w[105],v[105],c[105],dp[105]; 2 int main(){ 3 int T; 4 scanf("%d",&T); 5 while(T--){ 6 int W,n,ans = 0; 7 memset(dp,0,sizeof(dp)); 8 scanf("%d%d",&W,&n); 9 for(int i = 0 ; i < n ; i ++) scanf("%d%d%d",&w[i],&v[i],&c[i]); 10 for(int i = 0 ; i < n ; i ++){ 11 // for(int j = w[i] ; j <= W ; j ++){ 12 for(int j = W ; j >= w[i] ; j --){ //倒着来 13 for(int k = 1 ; k <= c[i] ; k ++){ 14 if(j < k*w[i]) break; 15 dp[j] = max(dp[j],dp[j-k*w[i]]+v[i]*k); 16 if(dp[j] > ans) ans = dp[j]; //经费不用完,记录答案 17 } 18 } 19 } 20 printf("%d\n",ans); 21 } 22 return 0; 23 }
时间: 2024-10-07 20:24:15