算法基础之分组背包问题

2023-12-24 17:47:11

分组背包问题

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

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

      • 每个v w 都是二维的 每次取一个 代表一组中取一个
    •   #include<iostream>
        #include<cstring>
        #include<algorithm>
        
        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++)
                    {
                        if(j>=v[k]) f[j] = max(f[j] , f[j-v[k]] + w[k]);
                        //                              v[i][k]  w[i][k]
                    }
                }
            }
            cout<<f[m];
        }
      

文章来源:https://blog.csdn.net/Pisasama/article/details/135183708
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。