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的背包这样的简单问题处理。

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

 

posted @ 2013-10-09 22:25  ps龙之吻  阅读(1122)  评论(0编辑  收藏  举报