多重背包

#include <iostream>
#include <cstring>
using namespace std;
const int Max = 100;
int N,W;
int w[Max],v[Max],num[Max];

int f[Max];
void ZeroOnePack(int nweight,int nvalue)
{
    for(int j=W;j>=nweight;j--)
        f[j]=max(f[j],f[j-nweight]+nvalue);
}
void CompletePack(int nweight,int nvalue)
{
    for(int j=nweight;j<=W;j++)
        f[j]=max(f[j],f[j-nweight]+nvalue);
}
int MultiKnapsack()
{
    memset(f,0,sizeof(f));
    for(int i=1;i<=N;i++)
    {
        if(w[i]*num[i]>=W){
            CompletePack(w[i],v[i]);
        }else{
            int k=1,cnt=num[i];
            while(k<=cnt){
                ZeroOnePack(k*w[i],k*v[i]);
                cnt-=k;
                k*=k;
            }
            ZeroOnePack(cnt*w[i],cnt*v[i]);
        }
    }
    return f[W];
}
int main()
{
    cin>>N>>W;
    for(int i=1;i<=N;i++) cin>>w[i];
    for(int i=1;i<=N;i++) cin>>v[i];
    for(int i=1;i<=N;i++) cin>>num[i];
    cout<<MultiKnapsack()<<endl;
    return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
const int Max = 100;
int N,W;
int w[Max],v[Max],num[Max];

int f[Max][Max];

int MultiKnapsack()
{
    memset(f,0,sizeof(f));
    for(int i=1;i<=N;i++)
    {
        for(int j=w[i];j<=W;j++)
        {
            int cnt = min(num[i],j/w[i]);
            for(int k=0;k<=cnt;k++)
            {
                f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);
            }
        }
    }
    return f[N][W];
}
int main()
{
    cin>>N>>W;
    for(int i=1;i<=N;i++) cin>>w[i];
    for(int i=1;i<=N;i++) cin>>v[i];
    for(int i=1;i<=N;i++) cin>>num[i];
    cout<<MultiKnapsack()<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/qie-wei/p/10160161.html