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正则匹配抓取豆瓣电影链接和评论代码分享
Dec 27 Python
python处理PHP数组文本文件实例
Sep 18 Python
Python探索之自定义实现线程池
Oct 27 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
Python实现模拟浏览器请求及会话保持操作示例
Jul 30 Python
Django如何防止定时任务并发浅析
May 14 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Python Django的安装配置教程图文详解
Jul 17 Python
python支持多线程的爬虫实例
Dec 21 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
django inspectdb 操作已有数据库数据的使用步骤
Feb 07 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 获取当前访问的url文件名的方法小结
2010/02/08 PHP
php快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
图解找出PHP配置文件php.ini的路径的方法
2014/08/20 PHP
ThinkPHP实现带验证码的文件上传功能实例
2014/11/01 PHP
PHP进阶学习之依赖注入与Ioc容器详解
2019/06/19 PHP
IE6下js通过css隐藏select的一个bug
2010/08/16 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
javascript学习笔记(二)数组和对象部分
2014/09/30 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
详解微信小程序Page中data数据操作和函数调用
2017/09/27 Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
2018/07/10 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
JavaScript隐式类型转换代码实例
2020/05/29 Javascript
JS实现密码框效果
2020/09/10 Javascript
详解vue 中 scoped 样式作用域的规则
2020/09/14 Javascript
Python中__init__.py文件的作用详解
2016/09/18 Python
基于Python log 的正确打开方式
2018/04/28 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
使用apiDoc实现python接口文档编写
2019/11/19 Python
TensorFlow 读取CSV数据的实例
2020/02/05 Python
Python常用GUI框架原理解析汇总
2020/12/07 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
节能减排倡议书
2014/04/15 职场文书
委托函范文
2015/01/29 职场文书
电影复兴之路观后感
2015/06/02 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
PyMongo 查询数据的实现
2021/06/28 Python
介绍一下28个JS常用数组方法
2022/05/06 Javascript