算法基础之多重背包问题I

多重背包问题I

  • 核心思想:01背包的扩展

    • 多加一层循环s次 每次再取max即可

    •   #include
        #include
        #include
        
        using namespace std;
        const int N = 110;
        
        int n,m;
        int f[N];
        
        int main()
        {
            cin>>n>>m;
            
            for(int i=1;i<=n;i++)
            {
                int v,w,s;
                cin>>v>>w>>s;  //也可以用数组存
                for(int j=m;j>=v;j--)  //01背包扩展 也是逆序
                {
                    for(int k=1;k<=s && k * v <=j ;k++)  //k循环s次 k*v <= j
                    {
                        //k * v , k * w
                        f[j] = max(f[j], f[j-k * v] + k * w);
                    }
                }
            }
            
            cout<<f[m];
        }
      

你可能感兴趣的:(算法,数据结构,c++,图论,散列表)