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文件字符串转列表时遇到空行的问题
Jul 09 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
详解pandas数据合并与重塑(pd.concat篇)
Jul 09 Python
python数据类型之间怎么转换技巧分享
Aug 20 Python
PyTorch中反卷积的用法详解
Dec 30 Python
使用Python 自动生成 Word 文档的教程
Feb 13 Python
python函数enumerate,operator和Counter使用技巧实例小结
Feb 22 Python
Python Excel vlookup函数实现过程解析
Jun 22 Python
Python logging模块原理解析及应用
Aug 13 Python
Django修改app名称和数据表迁移方案实现
Sep 17 Python
python 实用工具状态机transitions
Nov 21 Python
Python中lru_cache的使用和实现详解
Jan 25 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产生随机字符串函数
2006/12/06 PHP
PHP 地址栏信息的获取代码
2009/01/07 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
2017/08/04 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
jQuery中的$.ajax()方法应用
2014/05/06 Javascript
javascript获取wx.config内部字段解决微信分享
2016/03/09 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
利用node.js搭建简单web服务器的方法教程
2017/02/20 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
2017/09/03 jQuery
vue单页面打包文件大?首次加载慢?nginx带你飞,从7.5M到1.3M蜕变过程(推荐)
2018/01/16 Javascript
vue自定义一个v-model的实现代码
2018/06/21 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
小程序从手动埋点到自动埋点的实现方法
2019/01/24 Javascript
浅谈KOA2 Restful方式路由初探
2019/03/14 Javascript
python中threading超线程用法实例分析
2015/05/16 Python
Python中特殊函数集锦
2015/07/27 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
教你一步步利用python实现贪吃蛇游戏
2019/06/27 Python
python二元表达式用法
2019/12/04 Python
Python 中由 yield 实现异步操作
2020/05/04 Python
python3 简单实现组合设计模式
2020/07/02 Python
Python中常用的os操作汇总
2020/11/05 Python
Django中如何用xlwt生成表格的方法步骤
2021/01/31 Python
解决HTML5中的audio在手机端和微信端的不能自动播放问题
2019/11/04 HTML / CSS
英国老牌潮鞋店:Offspring
2019/08/19 全球购物
卫生安全检查制度
2014/02/04 职场文书
先进事迹报告会主持词
2014/04/02 职场文书
《音乐之都维也纳》教学反思
2014/04/16 职场文书
公司承诺书范文
2014/05/19 职场文书
汽车4S店销售经理岗位职责
2015/04/02 职场文书
安全生产标语口号
2015/12/26 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电