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获取CPU、内存和硬盘等windowns系统信息的2个例子
Apr 15 Python
Centos Python2 升级到Python3的简单实现
Jun 21 Python
python字符串string的内置方法实例详解
May 14 Python
python防止随意修改类属性的实现方法
Aug 21 Python
python实现多线程端口扫描
Aug 31 Python
python2与python3爬虫中get与post对比解析
Sep 18 Python
keras 特征图可视化实例(中间层)
Jan 24 Python
Python并发请求下限制QPS(每秒查询率)的实现代码
Jun 05 Python
解决Pycharm 中遇到Unresolved reference 'sklearn'的问题
Jul 13 Python
Python类class参数self原理解析
Nov 19 Python
如何用Python和JS实现的Web SSH工具
Feb 23 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
php上传大文件失败的原因及应对策略
2015/10/20 PHP
基于win2003虚拟机中apache服务器的访问
2017/08/01 PHP
jQuery 获取对象 定位子对象
2010/05/31 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
JS的数组迭代方法
2015/02/05 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
jQuery.Validate表单验证插件的使用示例详解
2017/01/04 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
解决Mac node版本升级失败的问题
2018/05/16 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作
2019/02/27 jQuery
微信小程序搜索功能(附:小程序前端+PHP后端)
2019/02/28 Javascript
vue中activated的用法
2021/01/03 Vue.js
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
python2 与python3的print区别小结
2018/01/16 Python
python实现月食效果实例代码
2019/06/18 Python
python NumPy ndarray二维数组 按照行列求平均实例
2019/11/26 Python
Django 5种类型Session使用方法解析
2020/04/29 Python
pycharm如何使用anaconda中的各种包(操作步骤)
2020/07/31 Python
基于python实现简单C/S模式代码实例
2020/09/14 Python
Jmeter调用Python脚本实现参数互相传递的实现
2021/01/22 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
电气自动化大学生求职信
2013/10/16 职场文书
求职推荐信
2013/10/28 职场文书
网站客服岗位职责
2014/04/05 职场文书
住宅质量保证书
2014/04/29 职场文书
工作岗位说明书模板
2014/05/09 职场文书
工作能力自我评价2015
2015/03/05 职场文书
乡镇党建工作总结2015
2015/05/19 职场文书