信息学奥赛一本通 1272:【例9.16】分组背包
【题目链接】
ybt 1272:【例9.16】分组背包
【题目考点】
1. 动态规划:分组背包
【解题思路】
分组背包问题,特点是:每组中的物品最多可以取一件
1. 状态定义
集合:放入背包的物品方案
限制:物品所在分组的区间,背包大小
属性:价值
条件:最大
统计量:价值
状态定义:
dp[i][j]
: 在前i组物品中选择物品放入大小为j的背包能获得的最大价值。
2. 状态转移方程
记第i组物品有m个,这m个物品的编号为i1,i2,…,im。
第i物品的重量是w[i]
,价值是c[i]
。
集合:在前i组物品中选择物品放入大小为j的背包的所有方案
分割集合:第i组物品如何放入背包
- 如果不选择第i组物品,那么在剩余i-1组中选择物品放入大小为j的背包。
dp[i][j] = dp[i-1][j]
- 如果选择第i组物品中的第1个,该物品下标为i1。那么需要在剩余i-1组中选择物品放入大小为
j-w[i1]
的背包。dp[i][j] = dp[i-1][j-w[i1]]+c[i1]
- 如果选择第i组物品中的第2个,该物品下标为i2。那么需要在剩余i-1组中选择物品放入大小为
j-w[i2]
的背包。dp[i][j] = dp[i-1][j-w[i2]]+c[i2]
… - 如果选择第i组物品中的第m个,该物品下标为im。那么需要在剩余i-1组中选择物品放入大小为
j-w[im]
的背包。dp[i][j] = dp[i-1][j-w[im]]+c[im]
- 一般地,如果选择第i组物品中的第k个,该物品下标为x。那么需要在剩余i-1组中选择物品放入大小为
j-w[x]
的背包。dp[i][j] = dp[i-1][j-w[x]]+c[x]
。遍历第i组物品,求选择该组中每个物品后能得到的最大价值dp[i][j]
。 - 以上所有情况求最大值。
3. 复杂度分析
背包容量为V,物品总数量为N,分组数量为T。
分组背包一般解法:
- 时间复杂度: O ( V N ) O(VN) O(VN)
- 空间复杂度: O ( T V ) O(TV) O(TV)
滚动数组优化后:
- 空间复杂度: O ( V ) O(V) O(V)
【题解代码】
解法1:分组背包 一般解法
#include<bits/stdc++.h>
using namespace std;
#define V 205
#define N 35
#define T 15
int dp[N][V], w[N], c[N]; //dp[i][j]:在前i组物品中选择物品放入大小为j的背包能获得的最大价值。
vector<int> g[T];//g[i]:存储第i组物品的编号
int main()
{int v, n, t, p;cin >> v >> n >> t;for(int i = 1; i <= n; ++i){cin >> w[i] >> c[i] >> p;g[p].push_back(i);//第p组添加i }for(int i = 1; i <= t; ++i)//遍历各组 {for(int j = 0; j <= v; ++j){dp[i][j] = dp[i-1][j];for(int k = 0; k < g[i].size(); ++k){int x = g[i][k];if(w[x] <= j)dp[i][j] = max(dp[i][j], dp[i-1][j-w[x]]+c[x]);}}}cout << dp[t][v];return 0;
}
解法2:分组背包 滚动数组优化
#include<bits/stdc++.h>
using namespace std;
#define V 205
#define N 35
#define T 15
int dp[V], w[N], c[N]; //dp[i][j]:(第1维被优化掉)在前i组物品中选择物品放入大小为j的背包能获得的最大价值。
vector<int> g[T];//g[i]:存储第i组物品的编号
int main()
{int v, n, t, p;cin >> v >> n >> t;for(int i = 1; i <= n; ++i){cin >> w[i] >> c[i] >> p;g[p].push_back(i);//第p组添加i }for(int i = 1; i <= t; ++i)//遍历各组 {for(int j = v; j >= 0; --j){for(int k = 0; k < g[i].size(); ++k){int x = g[i][k];if(j >= w[x])dp[j] = max(dp[j], dp[j-w[x]]+c[x]);}}}cout << dp[v];return 0;
}
信息学奥赛一本通 1272:【例9.16】分组背包相关推荐
- 信息学奥赛一本通1272【例9.16】分组背包
题目描述] 一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn.这些物品被划分为若干组,每组中的物品互相冲突,最多 ...
- 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
[题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...
- 信息学奥赛一本通C++语言-----2036:【例5.3】开关门
[题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...
- 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02
/* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...
- 【例8】合唱队形(《信息学奥赛一本通第五版》)
/* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...
- 信息学奥赛一本通 2021:【例4.6】最大公约数
[题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...
- 信息学奥赛一本通(2032:【例4.18】分解质因数)
2032:[例4.18]分解质因数 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 582 通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...
- 信息学奥赛一本通——2062:【例1.3】电影票
2062:[例1.3]电影票 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 57341 通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...
- 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)
[题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...
最新文章
- 浅析利用MetaWeblog接口同步多个博客
- 服务器实际显示内存,服务器实际显示内存
- 多媒体计算机技术的主要特点,多媒体技术主要特点?
- 计算机视觉基础---OpenCV框架与图像插值算法(图像伸缩)cpp+python
- Win10鼠标右键菜单不显示怎么办?
- 电影台词搜索引擎,英语学习和视频创作的必备神器
- 四阶龙格库塔法的基本思想_利用龙格库塔法求解质点运动方程
- 联想电脑尺寸在哪里看_联想电脑型号怎么查看【详细介绍】
- 微信集成(帆软报表)
- 芯准TTE“宏时隙“调度机制 ——基本原理
- 解决https JDK导入安全证书
- Div Scroll Bar (用层模拟滚动条)
- mysql积累--索引
- Java-11-访问字符串中字符与字符串长度
- 我们要做杨百万,不做杨白劳
- BZOJ4180: 字符串计数 SAM+矩阵乘法
- 华为云之docker技术实现LNMP容器化—nginx配置文件
- adb devices后显示List of devices attached/unauthorized问题解决
- 新南威语言班C加,2020年新南威尔士大学语言班要求高不高
- TIA PORTAL S7-1200如何使用博途的仿真功能PLCSIM?