51nod多重背包问题

多重背包其实就是把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,背包)