ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

背包问题克星——分组背包

2020-01-16 09:43:15  阅读:238  来源: 互联网

标签:背包 int 35 分组 物品 克星 dp


背包问题克星——分组背包

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

算法:

首先判断一个分组当中的一件物品,同01背包一样,此物品存在两种状态,取与不取,若取此物品,则继续判断下一组的第一件物品,若不取此物品,则继续判断本组下一件物品,若该物品为本组最后一件物品,则判断下一组。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于组k}。使用一维数组的伪代码如下:

for 所有的组k
	for v=V..0
		for 所有的i属于组k
			f[v]=max{f[v],f[v-c[i]]+w[i]}

分组的背包问题将彼此互斥的若干物品称为一个组,这建立了一个很好的模型。不少背包问题的变形都可以转化为分组的背包问题由分组的背包问题进一步可定义“泛化物品”的概念,十分有利于解题。例题:hdu1712

例题:

一个旅行者有一个最多能用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

#include<bits/stdc++.h>
using namespace std;

int dp[205];
int v, n, t;
int w[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", &w[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++){
                int x = ve[i][k];
                if (j >= w[x])
                    dp[j] = max(dp[j], dp[j-w[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
*/
溺水的鱼。。。 发布了31 篇原创文章 · 获赞 13 · 访问量 628 私信 关注

标签:背包,int,35,分组,物品,克星,dp
来源: https://blog.csdn.net/weixin_43310882/article/details/103999140

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有