分組背包


分組背包:有若干個商品的小組,每個小組里面有若干個商品,每一組只能選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];
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM