http://acm.hdu.edu.cn/showproblem.php?pid=2191
分析:多重背包,不用装满
1)直接将多个暴力变为一个
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int NM=205;
int wei[NM],cost[NM],bag[NM],f[NM];
int main()
{
int i,j,T,V,n,k;
scanf("%d%",&T);
while(T--)
{
scanf("%d%d",&V,&n);
for(i=1;i<=n;i++)
scanf("%d%d%d",&cost[i],&wei[i],&bag[i]);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
for(k=1;k<=bag[i];k++) //将不同个数转化为01背包
for(j=V;j>=cost[i];j--)
{
if(f[j]<f[j-cost[i]]+wei[i])
f[j]=f[j-cost[i]]+wei[i];
}
printf("%d\n",f[V]);
}
return 0;
}