您的位置:首页 > 其它

hdu2191: 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

2012-07-26 11:54 260 查看
hdu2191: http://acm.hdu.edu.cn/showproblem.php?pid=2191
题意:容量为v的背包,有n种物品,每种物品时有限个的,有不同体积及价值,求最大价值
解法:多重背包
code:


#include<iostream>
#include<cstdio>
#include<algorithm>
int v[200],w[200],c[200],f[200];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int main()
{
int t,n,m,i,j,k,x;
scanf("%d",&t);
for(int y=0;y<t;y++)
{
memset(f,0,sizeof(f));
scanf("%d%d",&n,&m);
for(j=0;j<m;j++)
scanf("%d%d%d",&v[j],&w[j],&c[j]);
for(i=0;i<m;i++)
{
if(v[i]*c[i]>n)         //可看成完全背包
{
for(j=v[i];j<=n;j++)             //顺序
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
else
{
for(k=1;c[i]>k;k=k*2)            //二进制的思想,分为若干个价值为k*v[i]的物品,再01背包
{
for(j=n;j>=k*v[i];j--)             //逆序
f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
c[i]=c[i]-k;
}
for(j=n;j>=c[i]*v[i];j--)
f[j]=max(f[j],f[j-c[i]*v[i]]+c[i]*w[i]);
}
}
printf("%d\n",f
);
}
}
/*
input:
1            //case数
8 2          //经费、大米种类
2 100 4      //价格、重量、袋数
4 100 2
output:
400         //最大重量
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐