--hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

时间:2023-03-09 04:34:54
--hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

--hdu 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

解题思路:

多重背包:第 i 件物品有 j 个可用。

本题中 第 p[i] 类大米 有 c[i] 袋大米可买 ,故本题为多重背包。

n(总钱数)、m(种类)

p[i] 单价 h[i] 重量 c[i] 本种类的总袋数

01背包解题伪代码:

for i=1-m  //种类

for j=1-c[i]  //每种的最大袋数

for k=n-p[i] //总钱数-当前种类的单价

    f[k]=min{f[k],f[k-p[i]]+h[i]}

 #include<bits/stdc++.h>
 using namespace std;
 int main()
 {
     int c,n,m;
     scanf("%d",&c);
     while(c--)
     {
         ],h[],c[],f[];
         scanf("%d%d",&n,&m);
         memset(f,,sizeof(f));
         ; i<m; i++)
             scanf("%d%d%d",&p[i],&h[i],&c[i]);
         ; i<m; i++)
             ; j<c[i]; j++)
                 for(int k=n; k>=p[i]; k--)
                     f[k]=max(f[k],f[k-p[i]]+h[i]);
         printf("%d\n",f[n]);
     }
     ;
 }