【Python】0/1背包、动态规划
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,首先递归到索引为最后一个的物品,然后回溯,每回溯到一个物品时候就比较选取当前物品和不选取当前物品哪个更有价值
def maxVal(w, v, i, ws):
if i == 0:
if w[i] <= ws:
return v[i]
else:
return 0
without_i = maxVal(w, v, i-1, ws)#用递归算出不选取当前物品时候价值
if w[i] > ws:
return without_i
else:
with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]#算出选取当前物品时候的价值
return max(without_i, with_i) w = [5, 3, 2]
v = [9, 7, 8]
val = maxVal(w, v, 2, 5)
print(val)
这个方法可以正确运行,但是耗时为O(2^n),所以当数据量增大时候,耗时会急剧增大,有什么办法可以减小耗时?同时列举出所有可能得出结论?
这就用到动态规划了
拿上面这个例子来说
当我们考虑第二个也就是最后一个物品的时候,我们需要把第0个,第1个物品要不要选取考虑一次
当我们考虑第一个儿子时候,也要把第零个物品要不要选取考虑一次
。。。
当物品非常多的时候,就造成了非常大的浪费
那么,我们能不能每次考虑一个物品之后,就把每种情况下的特征和值记录下来,以供以后考虑别的物品时候使用?
这就是动态规划
在这个背包问题中,我们可以使用(i,ws)来描述决策树中每种情况,同时保存对应的值。
memo={}
def maxVal(w, v, i, ws):
try:
return memo[(i,ws)]
except KeyError:
if i == 0:
if w[i] <= ws:
memo[(i, ws)] = v[i]
return v[i]
else:
memo[(i, ws)] = 0
return 0
without_i = maxVal(w, v, i-1, ws)
if w[i] > ws:
memo[(i, ws)] = without_i
return without_i
else:
with_i = maxVal(w, v, i-1, ws-w[i]) + v[i]
res = max(without_i, with_i)
memo[(i, ws)] = res
return res w = [5, 3, 2]
v = [9, 7, 8]
val = maxVal(w, v, 2, 5)
print(val)
【Python】0/1背包、动态规划的更多相关文章
- poj1417 带权并查集+0/1背包
题意:有一个岛上住着一些神和魔,并且已知神和魔的数量,现在已知神总是说真话,魔总是说假话,有 n 个询问,问某个神或魔(身份未知),问题是问某个是神还是魔,根据他们的回答,问是否能够确定哪些是神哪些是 ...
- P1417 烹调方案 (0/1背包+贪心)
题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船飞到一半,gw发现了一个很严重的问题:肚子饿了~ gw还是会做饭的,于是拿出了储藏的 ...
- 洛谷 P1064 金明的预算方案 (有依赖的0/1背包)
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- POJ 1636 Prison rearrangement DFS+0/1背包
题目链接: id=1636">POJ 1636 Prison rearrangement Prison rearrangement Time Limit: 3000MS Memor ...
- POJ 1745 【0/1 背包】
题目链接:http://poj.org/problem?id=1745 Divisibility Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- 浙大PAT CCCC L3-001 凑零钱 ( 0/1背包 && 路径记录 )
题目链接 分析 : 就是一个 0/1 背包,但是需要记录具体状态的转移情况 这个可以想象成一个状态转移图,然后实际就是记录路径 将状态看成点然后转移看成边,最后输出字典序最小的路径 这里有一个很巧妙的 ...
- 牛客网 TaoTao要吃鸡 ( 0/1背包变形 )
题意 : 题目链接 分析 : 如果没有 BUG (即 h == 0 的时候)就是一个普通的 0 / 1 背包 需要讨论一下 h != 0 的情况 此时有就相当于有物品是有特权的 而且背包装有特权的物 ...
- HihoCoder - 1038 01背包 动态规划
#1038 : 01背包 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 且说上一周的故事里,小Hi和小Ho费劲心思终于拿到了茫茫多的奖券!而现在,终于到了小Ho领取奖励 ...
- Hdu 2955 Robberies 0/1背包
Robberies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
随机推荐
- 1 Java学习之 基本数据类型
1. 基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的.简单的,各种数据类型都需要在学习 ...
- Oracle常用语句记录
交集/差集/合集 select * from tb_a intersect minus union all select * from tb_b 条件分支 decode() 例如:搜索条件没有手机就查 ...
- UML九种图-包图、类图
UML九种图-包图.类图 一.包 (一)相关概念: 1.包: 一个包=一层=一个命名空间=一个文件夹 2.包的命名: 简单名:王老二 路径名:中国.河北省.廊坊市.廊坊师范学院.信息技术提高班.九期班 ...
- tmux tutorial
This is a great tutorial about tmux quick start: http://www.youtube.com/watch?v=wKEGA8oEWXw&nore ...
- zoj 1610 Count the Colors(线段树延迟更新)
所谓的懒操作模板题. 学好acm,英语很重要.做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意.最后确定了是线段树延迟更新果题.我就欣欣然上手敲了出来. 然后是漫长的段错误.... 第一次 ...
- PHP自学之路---雇员管理系统(2)
这个章节将讲解分层模式对雇员管理系统的系统,首先看下基本的流程图设计: 下面是具体的代码: 1.login.php(参照上节) 2.loginProcess.php <?php /** * * ...
- Ubuntu12.10 下搭建基于KVM-QEMU的虚拟机环境(八)
Libvirt 是用c写的一个管理虚拟机及其资源(如网络.存储和外设等)的工具库,它不仅支持KVM/QEMU,它还支持xen,Vmware,OpenVZ和VirtualBox等其他HyperVisor ...
- 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置
在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...
- tensorflow与kubernetes/docker结合使用实践
tensorflow tensorflow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流 ...
- java中的String类常量池详解
test1: package StringTest; public class test1 { /** * @param args */ public static void main(String[ ...