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模块包中__init__.py文件功能分析
Jun 14 Python
Python3 处理JSON的实例详解
Oct 29 Python
Python中elasticsearch插入和更新数据的实现方法
Apr 01 Python
python 利用for循环 保存多个图像或者文件的实例
Nov 09 Python
Python线程池模块ThreadPoolExecutor用法分析
Dec 28 Python
详解python中__name__的意义以及作用
Aug 07 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
flask实现验证码并验证功能
Dec 05 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
keras输出预测值和真实值方式
Jun 27 Python
Python 中的 copy()和deepcopy()
Nov 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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
PHP中使用php://input处理相同name值的表单数据
2015/02/03 PHP
分享PHP计算两个日期相差天数的代码
2015/12/23 PHP
微信支付开发发货通知实例
2016/07/12 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
PHP折半(二分)查找算法实例分析
2018/05/12 PHP
java解析json方法总结
2019/05/16 PHP
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
JavaScript模拟实现继承的方法
2015/03/30 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
javascript js 操作数组 增删改查的简单实现
2016/06/20 Javascript
jquery pagination分页插件使用详解(后台struts2)
2017/01/22 Javascript
jQuery动态移除和添加背景图片的方法详解
2017/03/07 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
jQuery插件HighCharts绘制的2D堆柱状图效果示例【附demo源码下载】
2017/03/14 Javascript
对于Javascript 执行上下文的全面了解
2017/09/05 Javascript
vue cli升级webapck4总结
2018/04/04 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
小程序websocket心跳库(websocket-heartbeat-miniprogram)
2020/02/23 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
微信小程序将页面按钮悬浮固定在底部的实现代码
2020/10/29 Javascript
[00:32]2018DOTA2亚洲邀请赛Newbee出场
2018/04/03 DOTA
Python中Django 后台自定义表单控件
2017/03/28 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
django的登录注册系统的示例代码
2018/05/14 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
土木工程建筑专业毕业生求职信
2013/10/21 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
充分就业社区汇报材料
2014/05/07 职场文书
副主任竞聘演讲稿
2014/08/18 职场文书
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS