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[n]);
}
}
/*
input:
1 //case数
8 2 //经费、大米种类
2 100 4 //价格、重量、袋数
4 100 2
output:
400 //最大重量
*/