0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同的几件物品,怎样放能让背包中物品的价值最大?

比如,有三件物品重量w,价值v分别是

w=[5,3,2]

v=[9,7,8]

包的容量是5,也就是我们要求得

maxVal=v1+v2+v3……

约束条件为:ws=w1+w2+w3……

我们的思路是,列举出所有可能的放入背包的选项,然后比较哪个价值大,这需要用到决策树。

决策树的思想是,用一组向量来描述当前的状态,比如 [当前考虑的物品i, 当前背包的空间w, 当前已获得的价值v],

决策树左儿子表示不选取当前物品np,右儿子表示选取当前物品p,首先递归到索引为最后一个的物品,然后回溯,每回溯到一个物品时候就比较选取当前物品和不选取当前物品哪个更有价值

 1 def maxVal(w, v, i, ws):
 2     if i == 0:
 3         if w[i] <= ws:
 4             return v[i]
 5         else:
 6             return 0
 7     without_i = maxVal(w, v, i-1, ws)#用递归算出不选取当前物品时候价值
 8     if w[i] > ws:
 9         return without_i
10     else:
11         with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]#算出选取当前物品时候的价值
12     return max(without_i, with_i)
13
14
15 w = [5, 3, 2]
16 v = [9, 7, 8]
17 val = maxVal(w, v, 2, 5)
18 print(val)

这个方法可以正确运行,但是耗时为O(2^n),所以当数据量增大时候,耗时会急剧增大,有什么办法可以减小耗时?同时列举出所有可能得出结论?

这就用到动态规划了

拿上面这个例子来说

当我们考虑第二个也就是最后一个物品的时候,我们需要把第0个,第1个物品要不要选取考虑一次

当我们考虑第一个儿子时候,也要把第零个物品要不要选取考虑一次

。。。

当物品非常多的时候,就造成了非常大的浪费

那么,我们能不能每次考虑一个物品之后,就把每种情况下的特征和值记录下来,以供以后考虑别的物品时候使用?

这就是动态规划

在这个背包问题中,我们可以使用(i,ws)来描述决策树中每种情况,同时保存对应的值。

 1 memo={}
 2 def maxVal(w, v, i, ws):
 3     try:
 4         return memo[(i,ws)]
 5     except KeyError:
 6         if i == 0:
 7             if w[i] <= ws:
 8                 memo[(i, ws)] = v[i]
 9                 return v[i]
10             else:
11                 memo[(i, ws)] = 0
12                 return 0
13         without_i = maxVal(w, v, i-1, ws)
14         if w[i] > ws:
15             memo[(i, ws)] = without_i
16             return without_i
17         else:
18             with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]
19         res = max(without_i, with_i)
20         memo[(i, ws)] = res
21         return res
22
23 w = [5, 3, 2]
24 v = [9, 7, 8]
25 val = maxVal(w, v, 2, 5)
26 print(val)

转载于:https://www.cnblogs.com/fcyworld/p/6243012.html

【Python】0/1背包、动态规划相关推荐

  1. Python 0/1背包、动态规划

    参考:http://www.cnblogs.com/fcyworld/p/6243012.html Python 0/1背包.动态规划 0/1背包问题:在能承受一定重量的背包中,放入重量不同,价值不同 ...

  2. python 完全背包问题_动态规划——背包问题python实现(01背包、完全背包、多重背包)...

    参考: 描述: 有N件物品和一个容量为V的背包. 第i件物品的体积是vi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包流量,且总价值最大. 二维动态规划 f[i][j] 表示只 ...

  3. 动态规划算法初步(6)——0/1 背包

    动态规划算法初步(6) 例题五:0/1 背包(背包型) 题目: 一个旅行者有一个最多能装m公斤物品的背包,现在有n件物品,它们的重量分别是w1,w2,-,wn,它们的价值分别为c1,c2,-,cn.若 ...

  4. 动态规划(五)——0/1背包

    0/1背包 一.0/1背包问题 1.实例讲解 2.DP求解0/1背包 3.输出0/1背包方案 二.0/1背包题目代码(持续更新) 一.0/1背包问题 给定n种物品和一个背包,物品i的重量为wi,价值为 ...

  5. C语言(CED)01背包——动态规划第二题

    一.问题描述 给定n种物品和一个背包.物品i的质量Wi,其价值Vi,背包的容量为c.问如何选择装入背包中的物品,使得装入背包中的物品总价值最大? 二.解题思想 01背包和最长公共子序列都是动态规划题目 ...

  6. 弗雷歇距离的原理及python代码实现(动态规划)

    弗雷歇距离的原理及python代码实现(动态规划) 在网上看了很多关于弗雷歇距离的介绍,结合自己的理解,出一版更通俗易懂.更清晰具体的解释. 最简单的解释自然是最短狗绳长度,但我将从另一个角度来解释它 ...

  7. java-01背包(动态规划)

    01背包(动态规划) package cn.dynamic;public class KnapsackProblem {public static void main(String[] args) { ...

  8. 0/1背包问题——动态规划、回溯、分支限界法对比

    0/1背包问题--动态规划.回溯.分支限界法对比 2017.12.19 20:42:02 字数 3713 阅读 2820 目录 1.问题描述 1.1 问题描述 1.2 问题的数学表示(规划类问题,此种 ...

  9. P1417 烹调方案 (0/1背包+贪心)

    题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...

  10. 算法分析与设计——蛮力法0/1背包

    蛮力法0/1背包 蛮力法 蛮力法是一种简单直接解决问题的方法,常常直接基于问题的描述,所以蛮力法也是最容易应用的方法. 蛮力法所依赖 的基本技术是遍历,即采用一定的策略依次处理待求解问题的所有元素,从 ...

最新文章

  1. micopython 18b20_micropython typboaed v202连接DS18B20测温小实验
  2. numactl:NETLINK示例源码
  3. 面向初学者的图形数据库:为什么我们需要NoSQL数据库,ACID与BASE的解释说明
  4. Ubuntu下跑通py-faster-rcnn、详解demo运作流程
  5. 1345.跳跃游戏IV-LeetCode
  6. h5首页加载慢_Webview加载H5优化小记
  7. mysql 事务 不同库_MYSQL数据库重点:事务与锁机制
  8. 英国政府采用开源办公套件“GovOffice”
  9. intellij idea 2016.3.5 控制台取消行数限制
  10. 动态规划 --- 13.1 Triangle ---- 相邻路径最小和 -- 图解
  11. mac搜索文件什么都没有,是为什么
  12. Apache HttpClient4使用教程
  13. ubuntu结束进程快捷键_ubuntu快捷键详细版
  14. Excel.js导出图片和表格
  15. 数字货币智能合约:分析以太坊信标链
  16. php导入mib表,Linux snmp导入MIB库
  17. My Thirty-fifth Page - 最大二叉树 - By Nicolas
  18. 使用逐浪CMS做网站如何引用Markdown编辑器
  19. sms deliver解码
  20. 你不知道的图片批量下载

热门文章

  1. 支付宝支付 第九集:产品数据和支付二维码对接
  2. java不会自动提示_eclispe中打点不会提示的解决方法,以及自动补全
  3. 压缩可以卸载吗_不可错过!螺杆压缩机故障分析详解(2)
  4. mysql 多个if_mysql if else 多条件
  5. portainer忘记用户名密码_【20201122】做个用户管理系统(6)——忘记密码页面、重置密码方式页面的模板制作...
  6. C++知识点杂记1——typedef、static_cast、const_cast、遍历二维数组、聚合类
  7. OPENCV图像创建,保存和复制
  8. C++保存不同的图片格式
  9. 判断奇偶microsoft visual basic_#梅园# 在心理学上面如何判断一个男生暗恋你的表现...
  10. Java架构-面试前必须知道的MySQL命令【explain】