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

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

  • 相关阅读:
    jquery toggle(listenerOdd, listenerEven)
    struts quick start
    hdu 1518 Square (dfs)
    hdu 2544 最短路 (最短路径)
    hdu 1754 I Hate It (线段树)
    hdu 1856 More is better (并查集)
    hdu 1358 Period (KMP)
    hdu 2616 Kill the monster (DFS)
    hdu 2579 Dating with girls(2) (bfs)
    zoj 2110 Tempter of the Bone (dfs)
  • 原文地址:https://www.cnblogs.com/lzh-cnblogs/p/3360260.html
Copyright © 2011-2022 走看看