分组背包

#include <bits/stdc++.h>
using namespace std;
int dp[1000][1000],n,m,v[1000][1000]={0},w[1000][1000]={0};
//dp 表示前i组容量为j
//有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,
// 求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大。
int main() {
    int p;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>p;
        for(int j=1;j<=p;j++) cin>>w[i][j]>>v[i][j];
        w[i][0]=v[i][0]=p;//存一下总数
    }
    memset(dp,0, sizeof(dp));
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            dp[i][j]=dp[i-1][j];//一个都不要
            for(int k=1;k<=w[i][0];k++){
                //枚举要那个
                if(j>=w[i][k])
                dp[i][j]=max(dp[i][j],dp[i-1][j-w[i][k]]+v[i][k]);
            }
        }
    }
    cout<<dp[n][m]<<endl;
    return 0;
}

 

posted @ 2020-06-06 20:58  西伯利亚挖土豆  阅读(145)  评论(0编辑  收藏  举报