您的位置:首页 > 其它

51nod多重背包问题

2016-04-20 16:39 323 查看
多重背包其实就是把01背包和完全背包写成两个函数然后调用一下就行了,当给的空间大于物品个数*它的容量的时候,那么对于这个物品来说相当于完全背包,反之则为01背包

//n为物品的种类,w为背包的容量,v[]是物品体积,price[]是物品价值,num[]是物品数量

#include <iostream>

using namespace std;
int v[105],price[105],num[105];
long long dp[50005];
void Zero_Pack(int value,int vv,int w)
{
for(int i=w; i>=vv; i--)
dp[i]=max(dp[i],dp[i-vv]+value);

}
void Complete_Pack(int value,int vv,int w)
{
for(int i=vv; i<=w; i++)
dp[i]=max(dp[i],dp[i-vv]+value);

}
long long Pack(int v[],int price[],int num[],int n,int w)
{
for(int i=1; i<=n; i++)
{
if(num[i]*v[i]>w)
{
Complete_Pack(price[i],v[i],w);
}
else
{
int k=1;
while(k<num[i])
{
Zero_Pack(k*price[i],k*v[i],w);
num[i]-=k;
k=k<<1;
}
Zero_Pack(num[i]*price[i],num[i]*v[i],w);

}
}
return dp[w];

}
int main()
{
int n,w;
while(cin>>n>>w)
{
long long sum=0;
for(int i=1; i<=n; i++)
cin>>v[i]>>price[i]>>num[i];
sum=Pack(v,price,num,n,w);
cout<<sum<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 背包