背包问题

来源:互联网 发布:socket() python 编辑:程序博客网 时间:2024/06/06 10:35

背包问题是经典的动态规划问题,动态规划一般用来解决最优化问题。在解决问题时,通常会通过求解子问题来保存子问题的解,这是DP的关键技术,也是DP方程建立的关键。

使用动态规划解决的第一个小问题是算法导论上的钢条切割。


对以上的价格表样例,进行模拟切割:

r1 = 1,切割方案1 = 1(无切割)
r2 = 5,切割方案2 = 2(无切割)
r3 = 8, 切割方案3 = 3(无切割)
r4 = 10, 切割方案4 = 2 + 2
r5 = 13, 切割方案5 = 2 + 3
r6 = 17, 切割方案6 = 6(无切割)
r7 = 18, 切割方案7 = 1 + 6或7 = 2 + 2 + 3
r8 = 22, 切割方案8 = 2 + 6
r9 = 25, 切割方案9 = 3 + 6
r10 = 30,切割方案10 = 10(无切割)

经过分析,可知用递归求解是指数级的效率,不可行。

我们可以通过公式rn=max(pi+rn-i)   1<=i<=n

pi是指不切割的情况,再对剩余的n-i进行切割,求解子问题

下面给出比较简单的一种版本:伪代码

BOTTOM_UP_CUT_ROD(p,n)    //p是一个数组,数组里有各个钢条长短可获得的效益{let r[0..n]be a new array    r[0]=0for j =1 to nq=负无穷for i=1 to jq=max(q,p[i]+r[j-i])        r[j]=q     return r[n]}

接着就继续阅读了导论上其他的子章节,觉得对动规的感悟远远不够,就开始看DP 背包问题。

http://blog.csdn.net/liuqiyao_01/article/details/8477725

看着这片博文,慢慢做着背包的题目,虽然还是不深入,但是基础的问题总算是能解了

下面开始介绍背包:


背包分很多种,其中最重要的当属01背包

即 一个容量为V的背包中,可以选择放置一些具有价值和容量的物品,使得背包的总价值最大。

第一个问题::::Bone Collector   


0 0
原创粉丝点击