zoukankan      html  css  js  c++  java
  • 分组背包

    分组背包:有若干个商品的小组,每个小组里面有若干个商品,每一组只能选1或0个商品的背包问题。

    #include<iostream>
    using namespace std;
    
    #define PII pair<int, int>
    #define v first
    #define w second
    
    const int N = 110;
    
    PII goods[N][N];
    int f[N][N];
    int s[N];
    int n, m;
    
    
    int main(){
        cin >> n >> m;
        
        for(int i = 1; i <= n; i ++){
            cin >> s[i];
            for(int j = 1; j <= s[i]; j ++)
                cin >> goods[i][j].v >> goods[i][j].w;
        }
        
        for(int i = 1; i <= n; i ++)
            for(int j = 1; j <= m; j ++){
                for(int k = 0; k <= s[i]; k ++)
                    if(goods[i][k].v <= j)
                        f[i][j] = max(f[i][j], f[i - 1][j - goods[i][k].v] + goods[i][k].w);
                    
            }
            
        cout << f[n][m];
    }
    

    等价变换代码

    #include<iostream>
    using namespace std;
    
    #define PII pair<int, int>
    #define v first
    #define w second
    
    const int N = 110;
    
    PII goods[N][N];
    int f[N];
    int s[N];
    int n, m;
    
    
    int main(){
        cin >> n >> m;
        
        for(int i = 1; i <= n; i ++){
            cin >> s[i];
            for(int j = 1; j <= s[i]; j ++)
                cin >> goods[i][j].v >> goods[i][j].w;
        }
        
        for(int i = 1; i <= n; i ++)
            for(int j = m; j >= 1; j --){
                for(int k = 0; k <= s[i]; k ++)
                    if(goods[i][k].v <= j)
                        f[j] = max(f[j], f[j - goods[i][k].v] + goods[i][k].w);
                    
            }
            
        cout << f[m];
    }
    
  • 相关阅读:
    咨询
    xcode技巧
    礼仪
    asi 网络框架
    iOS 开发问题 书籍 价值 改名 创业大赛app
    PS,UI,美工
    运营推广
    多线程 并发 文章
    手机技巧 文章
    javaScript 类文章
  • 原文地址:https://www.cnblogs.com/tomori/p/13614442.html
Copyright © 2011-2022 走看看