今天抓的四道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。。。

这么详细的讲解,小盆友们都会了吧?~噶呜~~

随机推荐

  1. ant 关键字和关键语句

    学习ant推荐的两个blog http://www.cnblogs.com/huozhicheng/archive/2010/04/08/2533199.htmlhttp://www.cnblogs. ...

  2. AV_百度百科

    AV_百度百科 AV(影片门类)

  3. Haxe UI框架StablexUI的使用备忘与心得(序)

    最近在手上的项目开发中,从原来的使用Sprite全手写UI,开始逐步使用StablexUI,感觉还是相当不错的,强大.高效.轻量.灵活,非常适应我当前的实际需求. 不过作为小种语言的一个小众第三方开源 ...

  4. 一个带动画效果的颜色选择对话框控件AnimatedColorPickerDialog

    android4.4的日历中选择日程显示颜色的时候有一个颜色选择对话框非常漂亮,模仿他的界面我实现了一个类似的对话框,而且带有动画效果. 代码的实现可讲的地方不多,主要是采用了和AlertDialog ...

  5. cocos2d-x2.0 win7第一次创建项目需要调用到的脚本(不断更新维护)//cocos2d-x 教程一

    第一步: 最新的cocos2d-x.下载地址https://github.com/cocos2d/cocos2d-x github上最新的引擎,值得注意的是官网上发布的引擎是稳定版.选择哪种就看个人喜 ...

  6. 数据备份--dump(此作者有许多有用的博客文章)

    数据中 心操作大量的数据.当遭到破坏时,这就是一场灾难.这时候需要备份来恢复,及时你又大量的备份数据都没用,备份也肯定不是在浪费时间.你也许很幸运从 来没有经历过数据丢失.但是, 由于这种事情极少发生 ...

  7. 在Qt中如何使用QtDesigner创建的UI文件

    使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要 ...

  8. 基于visual Studio2013解决C语言竞赛题之1013字符串查找

         题目 解决代码及点评 /* 功能:编写函数IND,让它判断一个字符串是否为另一个字符串的子串的功能,若是则返回第一次出现的起始位置,否则返回0 时间:13:55 2013 ...

  9. C++智能指针的实现

    说起智能指针,不少人都不陌生.比方auto_ptr.shared_ptr.unique_ptr.weak_ptr. 依据shared_ptr的功能,自己仿造也实现了个. 对于shared_ptr这样的 ...

  10. HDU 2544 最短

    链接:http://acm.hdu.edu.cn/showproblem.php? pid=2544 解析: 首先数据量为V<=100 那么这里使用不论什么基础的最短路的算法都不会超时! 常见数 ...