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。。。
这么详细的讲解,小盆友们都会了吧?~噶呜~~
随机推荐
- 闲扯 Javascript 00
引言 Javascript 的作用在此就不阐述了,相信你已经知道它的用途!那我说点什么呢? 不如就和大家先扯一把,后面的工作 随后后展开吧! 首先声明:我个人对Javascript 认识,我只知道它 ...
- Socket编程模式理解与对比
本文主要分析了几种Socket编程的模式.主要包括基本的阻塞Socket.非阻塞Socket.I/O多路复用.其中,阻塞和非阻塞是相对于套接字来说的,而其他的模式本质上来说是基于Socket的并发模式 ...
- HTML5给我们带来了什么
websocket 根据维基定义 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端直接向客户端推送数据而不需要客户端进行请求,在 WebSocket API 中,浏览器和服 ...
- PowerMock mock私有方法
import java.util.Random; public class CodeWithPrivateMethod { public void meaningfulPublicApi() { if ...
- haproxy path_beg
path_beg : prefix match 前缀匹配 path_dir : subdir match path_dom : domain match path_end : suffix match ...
- Google C++ style guide——命名约定
1.通过命名规则 函数命名.变量命名.文件命名应具有描写叙述性. 类型和变量应该是名词,函数名能够用"命令性"动词. 2.文件命名 文件名称所有小写,能够包括下划线(_)或者断线( ...
- .bat脚本将windows server 2008设置成ntp时间同步服务器
@echo off echo autor OAK @echo off echo -------------------------------- @echo off REG ADD HKEY_LOCA ...
- jquery 中获取所有选中的checkbox的用法
以往还错误的把$("input[type='checkbox'][checked]") 是正确的用法,奇怪的是:这样用之前确实是好用的,单当我页面中的html内容超过1000行时, ...
- SwifThumb.com 第一家Swift开发人员论坛 QQ群 343549891
官方QQ群2: 兴许会有app出来让大家随时地学习Swift并在线交流~ watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQW5ld2N6cw==/font ...
- hdu4712 Hamming Distance
Hamming Distance Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) To ...