Zeroonepack coming~^.^
今天抓的四道DP做完了==三道是用背包做的,突然想起来背包知识点总结还没做~反正时间还早。。把01背包和完全背包小结了吧~~福利来啦~~噶呜~
01背包:
基本思路:
01背包问题是最广为人知的动态规划问题之一,介绍01背包之前,先来看一个引例:
有N件物品和一个容量为V的背包。第i件物品的体积是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。
这是最基础的背包问题,特点是:每件物品只有一件,选择放或者不放。
由以上的特点,我们可以写出状态转移方程:
f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}
这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的
如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”,
价值为f[i-1][v];
如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c[i]的背包中”,
此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。
优化空间复杂度:
以上方法的时间空间复杂度为O(VN);能优化到O(N);该思路如何实现呢?
主循环肯定是(1~N),如果用一个数组f[0~V]能不能保证第i次结束后f[v]中表示的就是我们定义的状态f[i][v]呢?
f[i][v]是由f[i-1][v],f[i-1][v-c[i]]两个子问题递推而来的,能否在推f[i][v]的时候也能够得到f[i-1][v],f[i-1][v-c[i]]的值呢?事实上,只要我们每次主循环中以v=V~0
的顺序推f[v],就能保证f[v]是f[v-c[i]]保存的是状态f[i-1][v-c[i]]的值。
伪码:
for i=1..N
for v=V..0
f[v]=max{f[v],f[v-c[i]]+w[i]};
为了方便使用,写出01背包的过程:
zreoonepack(cost,weight)//cost和weight分别表示这件物品的费用和价值
for v:V~cost
do f[v]=max(f[v],f[v-cost]+weight).
有了这个过程,01背包的伪码就写成啦:
for i:1~N
do zreoonepack(c[i],w[i]);
初始化细节问题:
在求最优解背包的问题中,要特别注意题目的问法~:是否要求恰好装满背包!!
如果是要求恰好装满背包,在初始化时除了f[0]=0外,其他f[1~V]均设为负无穷~~
若没有要求,初始化时只需要将f[0~v]全部设为0.
下面简述原因:
如果要求恰好装满背包,那么此时只有容量为0的背包可能被价值为0的nothing恰好装满,其他容量背包均无合法解。
一个常数优化:
for i=1..N
for v=V..0
do。。。
可以将这个循环的下限进行改进:由于只需要最后f[v]的值,倒推前一个物品,其实只需要知道f[v-w[n]]即可,所以代码可以改成
for i=1..N
do bound:max(V-sumw[i~n],c[i])
for v=V..to bound
do。。。
这么详细的讲解,小盆友们都会了吧?~噶呜~~
随机推荐
- 分享非常有用的Java程序(关键代码)(七)---抓屏程序
原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...
- 一道经典的C++结构体的题目
题目描述: 有10个学生,每个学生的数据包括学号.姓名.英语.数学.物理三门课的成绩,从键盘输入10个学生数据,要求打印出3门课程的总平均成绩,以及最高分的学生的数据(包括学号,姓名,3门课的平均成绩 ...
- 使用【百度云推送】第三方SDK实现推送功能具体解释
之前介绍过怎样使用shareSDK实现新浪微博分享功能,今天介绍怎样使用百度云推送SDK实现Android手机后台推送功能. 执行效果例如以下 第一步,假设使用百度的SDK,当然要先成为百度的开发人员 ...
- 关于caffe-windows中 compute_image_mean.exe出现的问题
这两天有兴致装了下caffe.感受下这个框架. 可是在这个过程中遇到非常多问题.我把碰到的问题和解决方式写下,便于后人高速上手. compute_image_mean.exe 编译出来后.运行数据变换 ...
- 《大象UML》看书笔记2:
<大象UML>看书笔记2 抽象角度: 在为现实世界建模的时候,首先要搞清楚有多 ...
- Java:Java快速入门
链接地址:http://www.cnblogs.com/happyframework/p/3332243.html 你好,世界! 源代码组织方式 Java程序由package+class组成,pack ...
- Apache Flink
Flink 剖析 1.概述 在如今数据爆炸的时代,企业的数据量与日俱增,大数据产品层出不穷.今天给大家分享一款产品—— Apache Flink,目前,已是 Apache 顶级项目之一.那么,接下来, ...
- Android 点亮屏幕
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- 【linux】内核源代码下载与阅读
原创,转载时请注明,谢谢.邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog. ...
- Endnote X6 如何修改输出格式(output style)成为自己想要的输出格式:
Endnote X6 如何修改输出格式(output style)成为自己想要的输出格式: (1)首先尝试在endnote output style 网站中查找: http://www.endnote ...