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;
}

本文介绍了一个经典的多重背包问题,通过实例讲解如何利用2的幂次分解的方法来优化解决该问题。通过对不同种类大米的价格和数量进行处理,实现用有限资金购买最大重量大米的目标。
538

被折叠的 条评论
为什么被折叠?



