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之变量和参数
Oct 10 Python
Python标准库内置函数complex介绍
Nov 25 Python
python通过定义一个类实例作为ftp回调方法
May 04 Python
放弃 Python 转向 Go语言有人给出了 9 大理由
Oct 20 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
python操作excel的包(openpyxl、xlsxwriter)
Jun 11 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
对Python中class和instance以及self的用法详解
Jun 26 Python
python文档字符串(函数使用说明)使用详解
Jul 30 Python
Python中bisect的使用方法
Dec 31 Python
python MD5加密的示例
Oct 19 Python
Python的三个重要函数详解
Jan 18 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 include_path设置技巧分享
2011/07/03 PHP
PHP单链表的实现代码
2016/07/05 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
2013/08/28 Javascript
使用js操作cookie的一点小收获分享
2013/09/03 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
详解JavaScript函数
2015/12/01 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
JavaScript 网页中实现一个计算当年还剩多少时间的倒数计时程序
2017/01/25 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
vue实现多个echarts根据屏幕大小变化而变化实例
2020/07/19 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
Python中实现两个字典(dict)合并的方法
2014/09/23 Python
初步解析Python中的yield函数的用法
2015/04/03 Python
python中使用正则表达式的连接符示例代码
2017/10/10 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
基于python中__add__函数的用法
2019/11/25 Python
matplotlib 范围选区(SpanSelector)的使用
2021/02/24 Python
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
大学生工作自荐书
2014/06/16 职场文书
趣味运动会广播稿
2014/09/13 职场文书
前台接待员岗位职责
2015/04/15 职场文书
《日月潭》教学反思
2016/02/20 职场文书
python爬虫框架feapde的使用简介
2021/04/20 Python
如何使用JavaScript策略模式校验表单
2021/04/29 Javascript
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers