分组背包问题

有N件物品,告诉你这N件物品的重量以及价值,将这些物品划分为K组,每组中的物品互相冲突,最多选一件,求解将哪些物品装入背包可使这些物品的费用综合不超过背包的容量,且价值总和最大。

 

其实,对于每一组的物品,都可以看成是一个01背包问题,因此我只需要对每组的物品都处理一遍即可。

例题:

一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

 

【输入格式】

 

   第一行:三个整数,V(背包容量,V<=200),N(物品数量,N<=30)和T(最大组号,T<=10);

 

   第2..N+1行:每行三个整数Wi,Ci,P,表示每个物品的重量,价值,所属组号。

 

【输出格式】

 

   仅一行,一个数,表示最大总价值。

 

sample in:

 

10 6 3

 

2  1  1

 

3  3  1

 

4  8  2

 

6  9  2

 

2  8  3

 

3  9  3

 

sample out:

 

20

 

代码:

int dp[205];
int v, n, t;
int we[35], c[35];
vector<int>ve[35];
 
int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int p;
     
    cin >> v >> n >> t;
    for(int i = 1; i <= n; i++){
        scanf("%d%d%d", &we[i], &c[i], &p);
        ve[p].push_back(i);
    }
    for(int i = 1; i <= t; i++){
        for(int j = v; j >= 0; j--){
            for(int k = 0; k < ve[i].size(); k++){//对每一个组号的物件进行01背包。
                int x = ve[i][k];
                if (j >= we[x])
                    dp[j] = max(dp[j], dp[j-we[x]]+c[x]);
            }
        }
    }
    printf("%d\n", dp[v]);
    return 0;
}
/*
10 6 3
2  1  1
3  3  1
4  8  2
6  9  2
2  8  3
3  9  3
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值