分组背包

分组背包:有若干个商品的小组,每个小组里面有若干个商品,每一组只能选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];
}
原文地址:https://www.cnblogs.com/tomori/p/13614442.html