Python基于回溯法子集树模板解决0-1背包问题实例


Posted in Python onSeptember 02, 2017

本文实例讲述了Python基于回溯法子集树模板解决0-1背包问题。分享给大家供大家参考,具体如下:

问题

给定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 True
  return False
# 套用子集树模板
def backpack(k): # 到达第k个物品
  global bag, maxv, maxw, bestbag
  if k==n: # 超出最后一个物品,判断结果是否最优
    cv = get_a_pack_value(bag)
    cw = get_a_pack_weight(bag)
    if cv > maxv : # 价值大的优先
      maxv = cv
      bestbag = bag[:]
    if cv == maxv and cw < maxw: # 价值相同,重量轻的优先
      maxw = cw
      bestbag = 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 w
  return sum([y[0] for y in filter(lambda x:x[1]==1, zip(w, bag))])
# 根据一个解bag,计算价值
def get_a_pack_value(bag):
  global v
  return 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基于回溯法子集树模板解决0-1背包问题实例

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python通过正则查找微博@(at)用户的方法
Mar 13 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
浅谈Pycharm调用同级目录下的py脚本bug
Dec 03 Python
python处理document文档保留原样式
Sep 23 Python
python基于opencv检测程序运行效率
Dec 28 Python
Python批量安装卸载1000个apk的方法
Apr 10 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
django表单中的按钮获取数据的实例分析
Jul 31 Python
Python实现淘宝秒杀功能的示例代码
Jan 19 Python
python3判断IP地址的方法
Mar 04 Python
Python的property属性详细讲解
Apr 11 Python
基于python 字符编码的理解
Sep 02 #Python
Python实现的简单模板引擎功能示例
Sep 02 #Python
Python实现Logger打印功能的方法详解
Sep 01 #Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 #Python
Python使用回溯法子集树模板解决迷宫问题示例
Sep 01 #Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 #Python
Python3.x对JSON的一些操作示例
Sep 01 #Python
You might like
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
js 提交和设置表单的值
2008/12/19 Javascript
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
深入解析contentWindow, contentDocument
2013/07/04 Javascript
解析使用JS 清空File控件的路径值
2013/07/08 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
NodeJS学习笔记之网络编程
2014/08/03 NodeJs
JQuery遍历DOM节点的方法
2015/06/11 Javascript
prototype框架中美元符号$用法分析
2016/01/22 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
JavaScript 详解预编译原理
2017/01/22 Javascript
自带气泡提示的vue校验插件(vue-verify-pop)
2017/04/07 Javascript
vue bootstrap小例子一枚
2017/06/09 Javascript
angular2 NgModel模块的具体使用方法
2019/04/10 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
深入浅析python定时杀进程
2016/06/06 Python
如何在Django配置文件里配置session链接
2019/08/06 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
科颜氏英国官网:Kiehl’s英国
2019/11/20 全球购物
mysql_pconnect()和mysql_connect()有什么区别
2012/05/25 面试题
资深地理教师自我评价
2013/09/21 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
代理人委托书
2014/09/16 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
企业党建工作总结2015
2015/05/26 职场文书
债务追讨律师函
2015/06/24 职场文书
行政处罚决定书
2015/06/24 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android
Android开发实现极为简单的QQ登录页面
2022/04/24 Java/Android