zoukankan      html  css  js  c++  java
  • 多重背包

    #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;
    }
    
  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/qie-wei/p/10160161.html
Copyright © 2011-2022 走看看