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

    暴力拆分

    暴力拆分就是把第\(i\)种物品看做\(s_i\)个独立的物品,每个物品只有一个,转化为01背包问题。

    const int N=110;
    int f[N];
    int n,m;
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=1;i<=n;i++)
        {
            int v,w,s;
            cin>>v>>w>>s;
            for(int k=1;k<=s;k++)
                for(int j=m;j>=v;j--)
                    f[j]=max(f[j],f[j-v]+w);
        }
    
        cout<<f[m]<<endl;
        //system("pause");
    }
    

    二进制拆分

    • 当物品满足\(s_i \times w_i >= V\)时,可以认为这种物品是不限数量的,按照完全背包的求解方法即可。
    • 否则,可以采用二进制拆分,将\(s_i\)个物品拆成若干个物品。
    const int N=2010;
    int f[N];
    int n,m;
    
    int main()
    {
        cin>>n>>m;
    
        for(int i=1;i<=n;i++)
        {
            int v,w,s;
            cin>>v>>w>>s;
            if(w*s >= m)
            {
                for(int j=v;j<=m;j++)//完全背包
                    f[j]=max(f[j],f[j-v]+w);
            }
            else
            {
                for(int k=1;s;k<<=1)
                {
                    int x=min(k,s);
                    for(int j=m;j>=v*x;j--)//01背包
                        f[j]=max(f[j],f[j-v*x]+w*x);
                    s-=x;
                }
            }
        }
    
        cout<<f[m]<<endl;
    
        //system("pause");
    }
    
  • 相关阅读:
    leetcode_Basic Calculator II
    leetcode_Basic Calculator
    LeetCode_Add Two Numbers
    LeetCode_Partition List
    LeetCode_Compare Version Numbers
    LeetCode—Longest Consecutive Sequence
    Thrift数据类型
    thrift简介
    grpc与json格式互转
    grpc测试
  • 原文地址:https://www.cnblogs.com/fxh0707/p/13762958.html
Copyright © 2011-2022 走看看