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批量生成本地ip地址的方法
Mar 23 Python
对python-3-print重定向输出的几种方法总结
May 11 Python
python3实现网络爬虫之BeautifulSoup使用详解
Dec 19 Python
Python设计模式之组合模式原理与用法实例分析
Jan 11 Python
python3对接mysql数据库实例详解
Apr 30 Python
Python调用graphviz绘制结构化图形网络示例
Nov 22 Python
关于tf.nn.dynamic_rnn返回值详解
Jan 20 Python
TensorFlow 多元函数的极值实例
Feb 10 Python
python GUI库图形界面开发之PyQt5美化窗体与控件(异形窗体)实例
Feb 25 Python
python实现跨excel sheet复制代码实例
Mar 03 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
如何判断pytorch是否支持GPU加速
Jun 01 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实现读取超大文件的方法
2014/07/28 PHP
thinkphp3.2.3 分页代码分享
2016/07/28 PHP
php实现微信扫码支付
2017/03/26 PHP
js中关于一个分号的崩溃示例
2013/11/11 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
关闭页面时window.location事件未执行的原因分析及解决方案
2014/09/01 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
js简单正则验证汉字英文及下划线的方法
2016/11/28 Javascript
详解vue前后台数据交互vue-resource文档
2017/07/19 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
vue实现添加与删除图书功能
2018/10/07 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
关于微信小程序map组件z-index的层级问题分析
2019/07/09 Javascript
[05:35]DOTA2英雄梦之声_第13期_拉比克
2014/06/21 DOTA
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
[51:50]完美世界DOTA2联赛 Magma vs GXR 第一场 11.07
2020/11/10 DOTA
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
2018/10/14 Python
python虚拟环境迁移方法
2019/01/03 Python
Python分布式进程中你会遇到的问题解析
2019/05/28 Python
pyqt5 lineEdit设置密码隐藏,删除lineEdit已输入的内容等属性方法
2019/06/24 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Pycharm配置PyQt5环境的教程
2020/04/02 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
前端canvas动画如何转成mp4视频的方法
2019/06/17 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
网络、C以及其他硬件方面的面试题
2016/08/23 面试题
酒店管理毕业生自我鉴定
2014/03/02 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
美术第二课堂活动总结
2014/07/08 职场文书
吴仁宝观后感
2015/06/09 职场文书
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技