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 相关文章推荐
详解python3实现的web端json通信协议
Dec 29 Python
Python PyQt4实现QQ抽屉效果
Apr 20 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
python实现可变变量名方法详解
Jul 01 Python
用Python配平化学方程式的方法
Jul 20 Python
Python字符串处理的8招秘籍(小结)
Aug 13 Python
Python Request爬取seo.chinaz.com百度权重网站的查询结果过程解析
Aug 13 Python
Python使用Turtle库绘制一棵西兰花
Nov 23 Python
Windows下python3安装tkinter的问题及解决方法
Jan 06 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
Pycharm中配置远程Docker运行环境的教程图解
Jun 11 Python
使用python绘制横竖条形图
Apr 21 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桌面中心(四) 数据显示
2007/03/11 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
Laravel5框架自定义错误页面配置操作示例
2019/04/17 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
值得分享的JavaScript实现图片轮播组件
2016/11/21 Javascript
Bootstrap免费字体和图标网站(值得收藏)
2017/03/16 Javascript
nuxt+axios解决前后端分离SSR的示例代码
2017/10/24 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
Python标准库之Sys模块使用详解
2015/05/23 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
python如何进行矩阵运算
2020/06/05 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
如何编写python的daemon程序
2021/01/07 Python
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
总经理助理岗位职责
2013/11/08 职场文书
日语专业毕业生自荐信
2013/11/11 职场文书
集体婚礼证婚词
2014/01/13 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
2014年大学生就业规划书
2014/04/04 职场文书
电台编导求职信
2014/05/06 职场文书
大学课外活动总结
2014/07/09 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
婚礼男方父母答谢词
2015/09/29 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
MySQL配置主从服务器(一主多从)
2021/08/07 MySQL
CentOS MySql8 远程连接实战
2022/04/19 MySQL