zoukankan      html  css  js  c++  java
  • 01背包初始化的理解

      前段时间看DP中的01背包问题,大部分内容都好理解,网上也有很多关于这个问题的博客,但自己提出的问题没有得到解决,只好苦思冥想,以求进一步理解。

      首先是问题描述:给定n种物品和一背包,物品i的重量是wi,其价值是pi,背包的容量是M,问如何选

    择装入背包中的物品总价值最大?  

      这里有两种情况一种是将背包恰好装满,一种是不要求恰好装满。解决这样的问题的方式就是通过设置初始化来解决。

      01背包详细内容不再唠叨了,大家看看http://www.cnblogs.com/lzh-cnblogs/p/3359881.html,现在主要就上述两

    种情况来说明。

      当要求恰好装满时,初始化f[0,0]=0

                  f[0,1]=f[0,2]=.......=f[0,n]=-∞

      当不要求恰好装满,初始化f[0,0]=f[0,1]=.......=f[0,n]=0  说明:这里的负无穷可以理解为没有方案可以满足要求。

      首先明白一点:动态规划的过程中总是将一个比较大的问题分解成子问题来解决,这个子问题与该较大问题

    具有共同的性质。f[i,v]是说从前i个物品中挑出物品,将他们放入体积为v的背包可以获得的最大价值。f[0,1....n]

    可以看做是从前0个物品中挑选,放入体积分别为0,1,.....,n的背包。f[0,1...n]可以看做是最简化的01背包问题了。

    它也是许多较大问题的最初的子问题。

      先来看恰好装满的情形:举个例子f[0,4]表示从前0个物品中挑选(没有物品可以选择)放入体积为4的背包,

    如果要求恰好装满,智商只要>0都知道不可能放满,所以f[0,4]=-∞,那么同理可见f[0,1...n]都没有办法满足恰好放

    满的要求,它们的值都为-∞。只有f[0,0]与它们不同,前0个物品放入体积为0的背包,恰好满足放满的要求。包里

    是空的,其物品价值=0,即f[0,0]=0。

      再来看不要求放满的情形:在这种要求下无论背包的体积是0到n的哪一个个,从前0个物品中选出放入体积

    为0....n的背包,它们都有方案可以满足情形的要求,也就是在不放入任何物品。此时包里没有物品它们的价值即f

    [0,0....n]初始化为0即可。


      再来从底向上看初始化的值是如何作用于较大规模的问题:

      假设有一个体积为10的背包,物品的体积分别为4、5、6,对应的价值为10,17,16 。

      由01背包的状态转移方程f[i,v]=max{f[i-1,v],f[i-1,v-v[i]]+w[i]} 

      可知计算f[3,10]需要知道f[2,10]与f[2,4]这两个子问题,每个子问题又需要计算更小的的子问题,这里做了下图以供说明:

       

      注意:这里出现了f[1,-1]它是完全不可能的一种情况,因为包的大小不可能为-1。

      如果要求恰好装满背包,显然f[3,10]=10+16=26,也就是选择体积为4与6的物品为价值最高且满足题意的选

    择。那么从01背包的算法如何得到正确的选择?由算法的过程可知要求f[3,10]需要求的子问题如上图所示。01背

    包算法从底向上计算,这里恰好装满背包则初始化f[0,0]=0,f[0,1...10]=-∞,即最下面的一排除了f[0,0]+10,其他几

    个子问题值都为-∞。由此依次往上计算,最终可知只有从f[0,0]+10     f[1,4]  f[2,4]+17  f[3,10] 这样的一条

    路径可以得到想要的结果,其他几条路径下f[3,10]=-∞即不能恰好装满。在满足题意的这条路径上可以看出选择

    了体积为4和6的物品,价值为26。

      如果要求不需恰好装满,f[0,0...n]=0,最下一排都有自己的值(不为-∞),从底向上计算可知在恰好装满背

    包中选出的路径得到的结果不是最大值,而是从f[0,1]+10开始的路径得到最大的值27。


      最后一个问题:本来要解决的是恰好装满背包与不需恰好装满背包的问题,如何联想到通过赋初值从而

    简单巧妙的解决的这个问题?

      一个思路是将背包问题的规模从大化小,考虑最简单的背包问题f[1,10]与考虑f[10000,1000000]是同样思路,那

    么在遇到f[i,v]的问题时是否可以考虑从f[0,1],f[0,2]等等这样的问题来考虑。装满与不需装满背包就可以将问题看

    做将前0个物品放入容量为v的背包这样的简单问题处理。

      总结就到这里,欢迎各位看官批评指正。  

  • 相关阅读:
    UWP 视觉状态管理 VisualStateManager
    RainbowEight
    Thread.Sleep在WinRT中---uwp应用
    fsasefa
    那年坑系列之好多坑_by二卷
    deep Learning Introduction_1_by二卷
    笔记本无线联网时VirtualBox的联网问题_by二卷
    Linux入门篇之目录结构_by二卷_待补充
    Python核心编程Ⅱ章3Python基础_by二卷
    数据挖掘导论章3探索数据_by二卷
  • 原文地址:https://www.cnblogs.com/lzh-cnblogs/p/3360260.html
Copyright © 2011-2022 走看看