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中的二进制位运算符
May 13 Python
python 统计代码行数简单实例
May 04 Python
Python3 XML 获取雅虎天气的实现方法
Feb 01 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
Jun 13 Python
python常用数据重复项处理方法
Nov 22 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
python输出pdf文档的实例
Feb 13 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
python如何实现递归转非递归
Feb 25 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 Python
Python下载商品数据并连接数据库且保存数据
Mar 31 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
Javascript中的数学函数集合
2007/05/08 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
JS获取IMG图片高宽的简单实例
2016/05/17 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
如何在Angular应用中创建包含组件方法示例
2019/03/23 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
python中 logging的使用详解
2017/10/25 Python
Python中scatter函数参数及用法详解
2017/11/08 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python 变量类型详解
2018/10/10 Python
解析python实现Lasso回归
2019/09/11 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
巴西箱包、背包、钱包和旅行配件购物网站:Inovathi
2019/12/14 全球购物
俄罗斯药房连锁店:ASNA
2020/06/20 全球购物
机电一体化专业应届本科生求职信
2013/09/27 职场文书
出国考察邀请函
2014/01/21 职场文书
安全施工责任书
2014/08/25 职场文书
实习单位鉴定意见
2015/06/04 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP