12 背包问题求具体方案(零一背包问题求具体方案)
1. 问题描述:
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出字典序最小的方案。这里的字典序是指:所选物品的编号所构成的序列。物品的编号范围是 1…N。
输入格式
第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。
输出格式
输出一行,包含若干个用空格隔开的整数,表示最优解中所选物品的编号序列,且该编号序列的字典序最小。物品编号范围是 1…N。
数据范围
0 < N,V ≤ 1000
0 < vi,wi ≤ 1000
输入样例
4 5
1 2
2 4
3 4
4 6
输出样例:
1 4
来源:https://www.acwing.com/problem/content/12/
2. 思路分析:
分析题目可以知道这道题目属于零一背包求具体方案的经典问题,所谓的具体方案其实是判断每一个当前的物品是否被选,也即怎么样决策的问题,动态规划求解具体的方案问题其实对应的是图论中的最短路问题;因为我们需要使用到下一个状态的值所以在求解具体方案的时候一般不使用状态压缩的写法,一般使用二维的动态规划写法,因为题目中设置了一个字典序最小的限制所以我们在求解零一背包问题的时候需要逆序遍历所有物品,这样可以确保选择物品的时候是从后面开始选择的,而且方便后面判断当前的物品是否被选择。其中dp[i][j]表示从第i个物品到最后一个物品中选且体积不超过j能够获得的最大价值,这样dp[1][V]就是在背包容量的前提下能够获得的最大价值。在求解字典序最小方案的过程中,我们从前往后遍历所有的物品,其中使用到的原则是对于当前的物品能选则选,这样在从前往后遍历的过程中字典序一定是最小的。
3. 代码如下:
if __name__ == '__main__':n, V = map(int, input().split())# 先存储0这个元素后面可以保证下标从1开始v, w = [0], [0]# 先存储物品的体积和价值这样方面后面倒着递推for i in range(n):_v, _w = map(int, input().split())v.append(_v)w.append(_w)dp = [[0] * (V + 1) for i in range(n + 2)]# 从后往前递推, 与之前不一样的是其实变换的只是下标for i in range(n, 0, -1):for j in range(V + 1):dp[i][j] = dp[i + 1][j]if j - v[i] >= 0:dp[i][j] = max(dp[i][j], dp[i + 1][j - v[i]] + w[i])j = V# 从前往后判断是否选择当前的物品for i in range(1, n + 1):if j - v[i] >= 0 and dp[i][j] == dp[i + 1][j - v[i]] + w[i]:print(i, end=" ")j -= v[i]
class Solution:def process(self):n, V = map(int, input().split())v, w = list(), list()for i in range(n):a, b = map(int, input().split())v.append(a)w.append(b)dp = [[0] * (V + 10) for i in range(n + 10)]for i in range(n - 1, -1, -1):for j in range(V + 1):dp[i][j] = dp[i + 1][j]if j - v[i] >= 0:dp[i][j] = max(dp[i][j], dp[i + 1][j - v[i]] + w[i])# 从前往后遍历j = Vfor i in range(n):if j - v[i] >= 0 and dp[i + 1][j - v[i]] + w[i] == dp[i][j]:j -= v[i]print(i + 1, end=" ")if __name__ == "__main__":Solution().process()
12 背包问题求具体方案(零一背包问题求具体方案)相关推荐
- 经典背包问题3——背包问题求方案数 、背包问题求具体方案
经典背包问题3--背包问题求方案数 .背包问题求具体方案 1. 背包问题求方案数 2. 背包问题求具体方案 1. 背包问题求方案数 有 N 件物品和一个容量是 V的背包.每件物品只能使用一次. 第 i ...
- 变种 背包问题_动态规划入门——传说中的零一背包问题
今天是周三算法与数据结构专题的第12篇文章,动态规划之零一背包问题.在之前的文章当中,我们一起探讨了二分.贪心.排序和搜索算法,今天我们来看另一个非常经典的算法--动态规划.在acm-icpc竞赛领域 ...
- 八十八、从斐波那契数列和零一背包问题探究动态规划
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划. ...
- 背包问题(1):关于零一背包问题的个人理解
一.经典背包问题(零一背包) 给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高.问题的名称来源于如何选择最合适的物品放置于给定背包中.(每个物品只能 ...
- 1024 装箱问题(零一背包问题)
1. 问题描述: 有一个箱子容量为 V,同时有 n 个物品,每个物品有一个体积(正整数).要求 n 个物品中,任取若干个装入箱内,使箱子的剩余空间为最小. 输入格式 第一行是一个整数 V,表示箱子容量 ...
- 1049 最后一块石头的重量 II(零一背包问题)
1. 问题描述: 有一堆石头,每块石头的重量都是正整数.每一回合,从中选出任意两块石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x ...
- python练习题(python之“求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数” 等)
实验环境:python2.7 题目1:python之"求一个数的阶乘并求结果中从后向前数第一个不为0(零)的数" 程序: import math def factorial(n): ...
- 01背包问题,多重背包问题-分组背包问题-完全背包问题-总结-内含4种经典背包问题
01背包问题: 例题:传送门 01背包问题的特点:背包容量有限,物品只有一个,具有确定的体积和价值,我们的目标就是在不超过背包最大体积的情况下装入价值尽可能大的物品,让我们输出最大总价值 对于背包问题 ...
- 给定激励,求零输入响应、零状态响应,全响应
%z_filter_imp.m %Z域表示的数字滤波器的响应举例 %H(Z)={Z^2 + 2Z + 1}/{Z^3 -0.5Z^2 -0.005Z^-1 +0.3} %初始状态 y(-1)= 1, ...
最新文章
- angular图片传到后台_告诉你,SpringBoot+Angular有多牛逼!
- 计算机桌面图标有背影,桌面图标有背影怎么解决
- taro压缩_Taro 如何开始微信小程序的开发
- Rustup 管理工具
- 【渝粤教育】国家开放大学2018年春季 0688-21T老年精神障碍护理 参考试题
- FATE框架安装后测试报错:ModuleNotFoundError: No module named ‘arch‘
- 黄光裕回应与京东、拼多多竞争:谁也灭不了谁 不排除合作的可能性
- 多线程编程(1): python对多线程的支持
- ​​​​​​​CUDA ---- Shared Memory
- 性能为王:选择模拟监控的10大理由!
- Julia: Dates =DateFormat, format,parse.......
- Python入门基础教程(非常详细)
- 信息检索1.4.学术搜索引擎--百度学术搜索
- 电子科技大学软件工程860考研专业课真题考频总结
- 苹果iOS开发者账号从零开始申请
- oracle exp导出很慢,oracleexp导出慢
- 安卓手机恢复大师镜像存储的使用教程
- 云原生数据库是未来数据库的天下
- 垃圾邮件分类(trec06c数据集)数据处理-特征提取
- Java测试中建桩-Method Stubs
热门文章
- Text-To-Speech(TTS)语音朗读
- 从一粒沙中看世界,一朵花里有天堂 08.11.2
- springmvc - 重定向与转发的区别
- ansible-galaxy 介绍
- 1年java工作经验面试前的准备
- 数据分析可视化利器:python pandas-profiling 一行代码EDA 探索性数据分析
- disconf mysql_分布式配置中心 Disconf实践- 安装篇
- Spring MVC接口解决GET请求时中文乱码的问题(前台向后台传递参数通过get方法)
- python 会计师事务所_工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
- iOS14 内购(IAP) applicationUsername 获取订单号为nil