问题

给定N个物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大?

分析

显然,放入背包的物品,是N个物品的所有子集的其中之一。N个物品中每一个物品,都有选择不选择两种状态。因此,只需要对每一个物品的这两种状态进行遍历。

解是一个长度固定的N元0,1数组。

套用回溯法子集树模板,做起来不要太爽!!!

代码

'''0-1背包问题'''n = 3            # 物品数量
c = 30           # 包的载重量
w = [20, 15, 15] # 物品重量
v = [45, 25, 25] # 物品价值maxw = 0  # 合条件的能装载的最大重量
maxv = 0  # 合条件的能装载的最大价值
bag = [0,0,0] # 一个解(n元0-1数组)长度固定为n
bags = []     # 一组解
bestbag = None # 最佳解# 冲突检测
def conflict(k):global bag, w, c# bag内的前k个物品已超重,则冲突if sum([y[0] for y in filter(lambda x:x[1]==1, zip(w[:k+1], bag[:k+1]))]) > c:return Truereturn False# 套用子集树模板
def backpack(k): # 到达第k个物品global bag, maxv, maxw, bestbagif k==n: # 超出最后一个物品,判断结果是否最优cv = get_a_pack_value(bag)cw = get_a_pack_weight(bag)if cv > maxv : # 价值大的优先maxv = cvbestbag = bag[:]if cv == maxv and cw < maxw: # 价值相同,重量轻的优先maxw = cwbestbag = bag[:]else:for i in [1,0]: # 遍历两种状态 [选取1, 不选取0] bag[k] = i  # 因为解的长度是固定的if not conflict(k): # 剪枝backpack(k+1)# 根据一个解bag,计算重量
def get_a_pack_weight(bag):global wreturn sum([y[0] for y in filter(lambda x:x[1]==1, zip(w, bag))])# 根据一个解bag,计算价值
def get_a_pack_value(bag):global vreturn sum([y[0] for y in filter(lambda x:x[1]==1, zip(v, bag))])# 测试
backpack(0)
print(bestbag, get_a_pack_value(bestbag))

效果图

python 回溯法 子集树模板 系列 —— 3、0-1背包问题相关推荐

  1. python 回溯法 子集树模板 系列 —— 1、8 皇后问题

    问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...

  2. python 回溯法 子集树模板 系列 —— 5、取物搭配问题

    问题 有5件不同的上衣,3条不同的裤子,4顶不同的帽子,从中取出一顶帽子.一件上衣和一条裤子作为一种搭配,问有多少种不同的搭配? 分析 换个角度看,现有头.身.腿三个元素,每个元素都有各自的几种状态. ...

  3. python 回溯法 子集树模板

    回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足 ...

  4. python回溯算法全排列_python 回溯法 子集树模板 系列 —— 11、全排列

    问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模板. 不过本文使用子集树模板.分析如下: 一个解x就是n个元素的一种排列,显然,解x的长度是固定 ...

  5. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  6. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例

    本文实例讲述了Python基于回溯法子集树模板解决找零问题.分享给大家供大家参考,具体如下: 问题 有面额10元.5元.2元.1元的硬币,数量分别为3个.5个.7个.12个.现在需要给顾客找零16元, ...

  7. python回溯方法的模板_Python基于回溯法子集树模板解决0-1背包问题实例

    本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题.分享给大家供大家参考,具体如下: 问题 给定N个物品和一个背包.物品i的重量是Wi,其价值位Vi ,背包的容量为C.问应该如何选择装入 ...

  8. python全排列问题_Python基于回溯法子集树模板解决全排列问题示例

    本文实例讲述了Python基于回溯法子集树模板解决全排列问题.分享给大家供大家参考,具体如下: 问题 实现 'a', 'b', 'c', 'd' 四个元素的全排列. 分析 这个问题可以直接套用排列树模 ...

  9. python棋盘放米问题_Python基于回溯法子集树模板解决马踏棋盘问题示例

    本文实例讲述了Python基于回溯法子集树模板解决马踏棋盘问题.分享给大家供大家参考,具体如下: 问题 将马放到国际象棋的8*8棋盘board上的某个方格中,马按走棋规则进行移动,走遍棋盘上的64个方 ...

最新文章

  1. Spring Boot第二篇:Spring Boot配置文件详解
  2. java基础之面试篇四-单向链表和双向链表区别
  3. KINDLE TOUCH修复板砖过程
  4. 1152 Google Recruitment (20 分)【难度: 简单 / 知识点: 模拟】
  5. 仿小黄车android定位,小黄车ofo是怎么实现自行车定位功能的?
  6. 2022牛客寒假算法基础集训营1 ——H 牛牛看云
  7. 大厂面试算法系列-如何实现链表的逆序(二)-递归法
  8. Python 数据结构与算法——二叉搜索树的实现
  9. [转] - 浅谈数据分析和数据建模
  10. webpack遇见的坑:Please install 'webpack-cli' in addition to webpack itself to use the CLI.
  11. 快速安装Pytorch
  12. 2021认证杯第二阶段数学建模思路论文交流群:984771555
  13. 计算机系统基础第二版_2020年注册环保工程师公共基础考试题库
  14. android netd的工作流程解析
  15. Nginx-浅析(转)
  16. 防火墙——GRE隧道讲解
  17. 一种可能的投资策略和一种可能的模糊的快速股票估值方法
  18. go加密算法:非对称加密(三)--Elliptic
  19. 信息安全方向就业要考哪些证书?
  20. vue3 路由的使用

热门文章

  1. java.lang.NoSuchFieldError: deferredExpression
  2. Devexpress XtraGrid 控件编辑的内容,如何实时生效
  3. 运维人员的补丁盛宴 四月修复微软Adobe漏洞合计过百!
  4. asp.net 包含动态创建控件的容器如果要切换显示/隐藏不要用 Visible 属性
  5. java 线程方法join的简单总结
  6. JavaScript语言精粹_JSON
  7. 大数据导论之为何需要引入大数据
  8. DAS、NAS、SAN、iSCSI 存储方案概述
  9. 刀片服务器与机架服务器对比
  10. 我们究竟应不应该使用框架?