算法基础之分组背包问题

分组背包问题

  • 核心思想:因为数据范围小 所以直接for循环组中每组数据

    • 每组数据输入完 for循环求f[j] = max(f[j] , f[j–v] + w) 01背包

      • 每个v w 都是二维的 每次取一个 代表一组中取一个
    •   #include
        #include
        #include
        
        using namespace std;
        const int N = 110;
        
        int v[N],w[N];
        int n,m;
        int f[N];
        
        int main()
        {
            cin>>n>>m;
            
            for(int i=0;i<n;i++)
            {
                int s;
                cin>>s;
                for(int j=0;j<s;j++) cin>>v[j]>>w[j];  //输入组中数据
                for(int j=m;j>=0;j--)  //01背包
                {
                    for(int k=0;k<s;k++)  //循环s次 但是f[j] 最终只更新一次
                    {
                        if(j>=v[k]) f[j] = max(f[j] , f[j-v[k]] + w[k]);
                        //                              v[i][k]  w[i][k]
                    }
                }
            }
            cout<<f[m];
        }
      

你可能感兴趣的:(算法,c++,数据结构)