背包问题
来源:互联网 发布: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
- 【无限背包】背包问题
- 背包问题---01背包
- 背包问题--部分背包
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- 背包问题
- Windows 休眠文件大小设置,就这么用到了
- Android 中的 Service 全面总结
- HDU 2795 Billboard(线段树点更新)
- 关于xcode模拟器显示中文的问题
- 程序员面试题目总结--链表(1)【单链表插入和删除】
- 背包问题
- 黑马程序员-菜鸟到大神的蜕变
- 代理模式深入(二)——动态代理实现机制
- C++中反正切atan2(y,x)与atan(x)
- 8大算法图文讲解
- 标签控制器部分知识
- ZXing 二维码应用
- OCP 1Z0 053 257
- Android进程通信之AIDL