【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 ...
随机推荐
- MS数据库优化查询最常见的几种方法
1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大 ...
- Jekyll报'Tag was never closed'错误
使用jekyll的代码高亮功能.但是发现有时总是很恼人的出现错误,报告说'Tag was never closed'.可是我很确定的关闭了标签啊,真是令人恼怒啊.解决方案式什么哪?如果你对此有兴趣,请 ...
- cocos2dx android lua文件设置问题
cocos2d-x版本: cocos2d-2.1rc0-x-2.1.2 通常我们在文件AppDelegate.cpp的applicationDidFinishLaunching()函数中设置lua代码 ...
- 最小堆实现优先队列:Python实现
最小堆实现优先队列:Python实现 堆是一种数据结构,因为Heapsort而被提出.除了堆排序,“堆”这种数据结构还可以用于优先队列的实现. 堆首先是一个完全二叉树:它除了最底层之外,树的每一层的都 ...
- phpcms 2008 后台发文章chrome和firefox文章不能上传图片的问题
/web/fckeditor/editor/dialog/fck_image.html /web/fckeditor/editor/dialog/fck_image/fck_image.js 这两个文 ...
- 微软必应借PK谷歌突围中国搜索市场
Bing“必应”是微软2009年推出的搜索品牌(http://www.bing.com),它取代的是同门师兄Live Search.进入2013年,在国内及好莱坞的多部大片里面,我都看到了Bing搜索 ...
- hdu 3074 Multiply game(模板级线段树)
离机房关门还有十分钟,这点时间能干些什么?故作沉思地仰望星空,重新捋一下一天的学习进度,或者,砍掉一棵模板级线段树. 纯模板,就是把单点更新,区间求和改为单点更新,区间求积. 1A. #include ...
- install cuda5 on ubuntu12.04
1. sudo apt-get install libglapi-mesa 2. sudo apt-get install freeglut3-dev build-essential libx11-d ...
- Dreamer 框架 比Struts2 更加灵活
winter 改名为Dreamer. 这次发布第二个版本. 这次修复了很多BUG 和完善了部分功能. 1.改进用户服务层 以后在服务层中只需要继承BaseSupport 泛型类 就可以实现对对象进行增 ...
- mongodb两次被黑后......
先说说事情的经过...... 2017年1月8号星期天,在家翻头条无意中看到一条新闻说很多用户的mongodb被黑了,数据都被删了.当时想着公司的爬虫用的也是mongodb做存储,应该不会被黑吧,不可 ...