您的位置:首页 > 其它

51nod-【多重背包问题】

2016-08-20 16:48 218 查看
<span style="font-size:18px;">#include<cstdio>
#include<cstring>
#define LL long long
LL f[50000+11];
struct node
{
int a;//重量
int b;//价值
}arr[50000];
LL max(LL x,LL y)
{
if(x>y)
return x;
return y;
}
int main()
{
LL n,w;
scanf("%lld%lld",&n,&w);
memset(f,0,sizeof(f));
LL wi,pi,ci,i,j=1;
for(i=1;i<=n;++i)
{
scanf("%lld%lld%lld",&wi,&pi,&ci);
int temp=1;
while(ci>=temp)
{
arr[j].a=wi*temp;//重量
arr[j].b=pi*temp;//价值
++j;
ci-=temp;
temp*=2;
}
arr[j].a=wi*ci;
arr[j].b=pi*ci;
++j;//这个地方一定要注意,j++,是不能少的,因为while循环可能进不去j的值一直等于1
} //开始没有加,找了好长时间都没有发现错误
for(i=1;i<j;++i)
{
for(int k=w;k>=arr[i].a;--k)
f[k]=max(f[k],f[k-arr[i].a]+arr[i].b);
}
printf("%lld\n",f[w]);
return 0;
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: