http://acm.hdu.edu.cn/showproblem.php?pid=2191
题意:现有m种大米,每种价格为p,重量为h,有c袋。求用n元钱最多可买多重的大米?
思路:典型的多重背包。
为节约时间,将c拆分成2的n次方相加的形式(可以表示出所有情况!)。
#include<stdio.h>
#include<string.h>
int main()
{
int t,v,m,bag[111],val[44444],w[44444];
while(scanf("%d",&t)==1)
{
while(t--)
{
int tmp,i,j,k=1;
scanf("%d %d",&v,&m);
while(m--)
{
int p,h,c;
scanf("%d %d %d",&p,&h,&c);
tmp=1;
while(c>=tmp)
{
val[k]=tmp*p;
w[k++]=tmp*h;
c-=tmp;
tmp<<=1;
}
val[k]=c*p;
w[k++]=c*h;
}
memset(bag,0,sizeof(bag));
for(i=1;i<k;i++)
{
for(j=v;j>=val[i];j--)
if(bag[j]<bag[j-val[i]]+w[i])
bag[j]=bag[j-val[i]]+w[i];
}
printf("%d\n",bag[v]);
}
}
return 0;
}