您的位置:首页 > 其它

51nod 1086 背包问题 V2 多重背包

2016-05-20 23:32 302 查看
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086

题意:有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。

标准的多重背包

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int d[55000],n,m;

void zeroonepack(int w,int p)
{
for(int i=m;i>=w;i--)
if(d[i]<d[i-w]+p)   d[i]=d[i-w]+p;
}

void completepack(int w,int p)
{
for(int i=w;i<=m;i++)
if(d[i]<d[i-w]+p)   d[i]=d[i-w]+p;
}

void multipack(int w,int p,int c)
{
if(w*c>=m)  completepack(w,p);
else
{
int k=1;
while(k<c)
{
zeroonepack(k*w,k*p);
c-=k;
k*=2;
}
zeroonepack(c*w,c*p);
}
}

int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(d,0,sizeof(d));
for(int i=0;i<n;i++)
{
int w,p,c;
scanf("%d%d%d",&w,&p,&c);
multipack(w,p,c);
}
cout<<d[m]<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: