
解题思路:
多重背包:第 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]); } ; }