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];
    }
    
  • 相关阅读:
    Win10系统下安装Tensorflow
    基于theano的深度卷积神经网络
    卷积层和池化层
    ReLu(Rectified Linear Units)激活函数
    向上取整&向下取整
    物品选取
    猫狗大战
    田忌赛马
    魔术棋子
    回文字串
  • 原文地址:https://www.cnblogs.com/tomori/p/13614442.html
Copyright © 2011-2022 走看看