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通过wxPython打开一个音频文件并播放的方法
Mar 25 Python
在Python中使用HTML模版的教程
Apr 29 Python
Python的“二维”字典 (two-dimension dictionary)定义与实现方法
Apr 27 Python
python实现各进制转换的总结大全
Jun 18 Python
python3调用windows dos命令的例子
Aug 14 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
python求平均数、方差、中位数的例子
Aug 22 Python
用python生成与调用cntk模型代码演示方法
Aug 26 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Python函数必须先定义,后调用说明(函数调用函数例外)
Jun 02 Python
关于Kotlin中SAM转换的那些事
Sep 15 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
解析百度搜索结果link?url=参数分析 (全)
2012/10/09 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
js+php实现静态页面实时调用用户登陆状态的方法
2015/01/04 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
xml和web特殊字符
2009/04/28 Javascript
Javascript 类与静态类的实现
2010/04/01 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
JS实现仿京东淘宝竖排二级导航
2014/12/08 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
使用JavaScript实现在页面中显示距离2017年中秋节的天数
2017/09/26 Javascript
Webpack 之 babel-loader文件预处理器详解
2018/03/23 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
详解python发送各类邮件的主要方法
2016/12/22 Python
利用python批量给云主机配置安全组的方法教程
2017/06/21 Python
python PyTorch预训练示例
2018/02/11 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
Python同步遍历多个列表的示例
2019/02/19 Python
Python3之手动创建迭代器的实例代码
2019/05/22 Python
iPython pylab模式启动方式
2020/04/24 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
美国专业汽车音响和移动电子产品零售商:Car Toys
2019/05/13 全球购物
内容编辑个人求职信
2013/12/10 职场文书
周年庆典邀请函范文
2014/01/24 职场文书
中学生打架检讨书
2014/02/10 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
离婚协议书范文
2015/01/26 职场文书
中秋节晚会开场白
2015/05/29 职场文书
Redis可视化客户端小结
2021/06/10 Redis