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类的专用方法实例分析
Jan 09 Python
详解Python中的array数组模块相关使用
Jul 05 Python
深入理解Python中的*重复运算符
Oct 28 Python
Python 在字符串中加入变量的实例讲解
May 02 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
详解Django CAS 解决方案
Oct 30 Python
tensorflow查看ckpt各节点名称实例
Jan 21 Python
python实现飞船游戏的纵向移动
Apr 24 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
使用python实现名片管理系统
Jun 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的5个入手程序
2006/11/23 PHP
PHP面向对象编程快速入门
2006/12/14 PHP
php 操作excel文件的方法小结
2009/12/31 PHP
在PHP中运行Linux命令并启动SSH服务的例子
2014/06/12 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
PHP正则验证Email的方法
2015/06/15 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
2007/08/15 Javascript
Javascript insertAfter() 实现函数代码
2011/10/12 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
jquery右下角弹出提示框示例代码
2013/10/08 Javascript
JavaScript实现更改网页背景与字体颜色的方法
2015/02/02 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
Sortable.js拖拽排序使用方法解析
2016/11/04 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
解决Mac下安装nmp的淘宝镜像失败问题
2018/05/16 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
美国美妆网站:B-Glowing
2016/10/12 全球购物
普通简短的个人自我评价
2014/02/15 职场文书
气象学专业个人求职信
2014/03/15 职场文书
诚信承诺书模板
2014/05/26 职场文书
国庆节活动总结
2014/08/26 职场文书
税务干部个人整改措施思想汇报
2014/10/10 职场文书
大学生见习报告范文
2014/11/03 职场文书
民主评议党员个人总结
2015/02/13 职场文书
七年级作文之雪景
2019/11/18 职场文书
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python