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中的split()函数的使用方法
Apr 07 Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 Python
python用Pygal如何生成漂亮的SVG图像详解
Feb 10 Python
Python探索之自定义实现线程池
Oct 27 Python
NumPy 基本切片和索引的具体使用方法
Apr 24 Python
Python编写带选项的命令行程序方法
Aug 13 Python
Python中zip()函数的简单用法举例
Sep 02 Python
python的等深分箱实例
Nov 22 Python
Python实现直播推流效果
Nov 26 Python
Pytorch之contiguous的用法
Dec 31 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
详解python方法之绑定方法与非绑定方法
Aug 17 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 批量删除 sql语句
2009/06/05 PHP
分享一下贝贝成长进度的php代码
2012/09/14 PHP
多个PHP中文字符串截取函数
2013/11/12 PHP
php实现表单多按钮提交action的处理方法
2015/10/24 PHP
php接口技术实例详解
2016/12/07 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
jquery+css实现绚丽的横向二级下拉菜单-附源码下载
2015/08/23 Javascript
jQuery手机拨号界面特效代码分享
2015/08/27 Javascript
Bootstrap实现下拉菜单效果
2016/04/29 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
Web制作验证码功能实例代码
2017/06/19 Javascript
python获得图片base64编码示例
2014/01/16 Python
Python标准异常和异常处理详解
2015/02/02 Python
Python实现读取并保存文件的类
2017/05/11 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
python能否java成为主流语言吗
2020/06/22 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
巧用CSS3的calc()宽度计算做响应模式布局的方法
2018/03/22 HTML / CSS
意大利综合购物网站:Giordano Shop
2016/10/21 全球购物
英国最大的网上药品商店:Chemist Direct
2017/12/16 全球购物
大学生会计职业生涯规划范文
2014/02/28 职场文书
入伍通知书
2015/04/23 职场文书
2015年“公民道德宣传日”活动方案
2015/05/06 职场文书
焦点访谈观后感
2015/06/11 职场文书
仙境之桥观后感
2015/06/16 职场文书
《圆的面积》教学反思
2016/02/19 职场文书
redis实现排行榜功能
2021/05/24 Redis