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爬虫入门教程之点点美女图片爬虫代码分享
Sep 02 Python
python的exec、eval使用分析
Dec 11 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
python 爬虫 批量获取代理ip的实例代码
May 22 Python
python-opencv颜色提取分割方法
Dec 08 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
Tensorflow进行多维矩阵的拆分与拼接实例
Feb 07 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
keras实现图像预处理并生成一个generator的案例
Jun 17 Python
python实现画图工具
Aug 27 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制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP实现通过中文字符比率来判断垃圾评论的方法
2014/10/20 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
php单态设计模式(单例模式)实例
2014/11/18 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
extjs grid取到数据而不显示的解决
2008/12/29 Javascript
JavaScript学习历程和心得小结
2010/08/16 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
让input框实现类似百度的搜索提示(基于jquery事件监听)
2014/01/31 Javascript
jQuery Ajax使用实例
2015/04/16 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
Bootstrap 附加导航(Affix)插件实例详解
2016/06/01 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
详解JavaScript栈内存与堆内存
2019/04/04 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
Python 检查数组元素是否存在类似PHP isset()方法
2014/10/14 Python
Python中给List添加元素的4种方法分享
2014/11/28 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
详解通过API管理或定制开发ECS实例
2018/09/30 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Anaconda+VSCode配置tensorflow开发环境的教程详解
2020/03/30 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python中的unittest框架实例详解
2021/02/05 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
使用CSS Grid布局实现网格的流动
2014/12/30 HTML / CSS
巴西网上药房:onofre
2016/11/21 全球购物
毕业生怎样写好自荐信
2013/11/11 职场文书
区域销售经理职责
2013/12/22 职场文书
庆六一活动总结
2014/08/29 职场文书
总经理岗位职责范本
2015/04/01 职场文书