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 相关文章推荐
RC4文件加密的python实现方法
Jun 30 Python
新手如何快速入门Python(菜鸟必看篇)
Jun 10 Python
浅谈python for循环的巧妙运用(迭代、列表生成式)
Sep 26 Python
实例讲解python中的协程
Oct 08 Python
python Pandas如何对数据集随机抽样
Jul 29 Python
python实现图片压缩代码实例
Aug 12 Python
对django layer弹窗组件的使用详解
Aug 31 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
使用TensorFlow搭建一个全连接神经网络教程
Feb 06 Python
python实现电子词典
Mar 03 Python
pytorch 如何把图像数据集进行划分成train,test和val
May 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
利用PHP实现智能文件类型检测的实现代码
2011/08/02 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
探讨PHP调用时间格式的参数详解
2013/06/06 PHP
ThinkPHP模版中导入CSS和JS文件的方法
2014/11/29 PHP
基于thinkPHP类的插入数据库操作功能示例
2017/01/06 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
jQuery中(function(){})()执行顺序的理解
2013/03/05 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
2016/04/05 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
headjs实现网站并行加载但顺序执行JS
2016/11/29 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
React Native第三方平台分享的实例(Android,IOS双平台)
2017/08/04 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
[02:42]DOTA2英雄基础教程 杰奇洛
2013/12/23 DOTA
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
用map函数来完成Python并行任务的简单示例
2015/04/02 Python
详细介绍Python中的偏函数
2015/04/27 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
Python3使用pandas模块读写excel操作示例
2018/07/03 Python
Python with标签使用方法解析
2020/01/17 Python
python数据类型强制转换实例详解
2020/06/22 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
澳大利亚床上用品、浴巾和家居用品购物网站:Bambury
2020/04/16 全球购物
自考生自我鉴定范文
2013/10/01 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
羽毛球社团活动总结
2014/06/27 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
2016公司新年问候语
2015/11/11 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
一起来看看Vue的核心原理剖析
2022/03/24 Vue.js
Golang流模式之grpc的四种数据流
2022/04/13 Golang