首页 > 其他 > 详细

分组背包

时间:2020-06-06 21:24:25      阅读:48      评论:0      收藏:0      [点我收藏+]
#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;
}

 

分组背包

原文:https://www.cnblogs.com/MorrowWind/p/13056400.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!