01背包问题

问题描述:

      有 n 件物品x1, x2, …, xn , 每件物品有一个价值和一个重量,分别记为:

      v1,v2, …vn

      w1,w2, …wn

其中所有的 wi 均为整数。 现有一个背包,其最大载重量为m,要求从这n件物品中任取若干件(这些物品每样只有一件,要么被装入要么被留下)。问背包中装入哪些物品可使得所装物品的价值和最大? (我们只需要求出最大价值,不需要求出具体拿的是哪些物品)

例如,m=23, n = 5,

        vi : 19 24 33 45 50

        wi : 5   6  8   11 12

最大价值为:95

分析:

       如果想用贪心,先求出平均价值,然后从高到低的方法来取,如果有一个背包的容量为10,共有3个物品,体积分别是3、3、5,价值分别是6、6、9,那么你的方法取到的是前两个物品,总价值是12,但明显最大值是后两个物品组成的15。因此贪心的方法不能得到正确结果。

       换一个更简单的方式来思考:每个物品只有2种选择,要么放入,要么不放入。

      (1)放入:问题转换为在背包载重为m-wi的情况下,在其它n-1件物品中挑选,求得价值和最大。等把这个子问题求出后,再加上vi的价值就是整个问题的最优解了。 

      (2) 没放入:那么就当xi 根本不存在,直接解物品数量为n-1,背包载重为m的子问题。子问题的最优解就是问题的最优解。

      定义函数f(i,j)为在1~i 件物品中选若干件装入限重为 j 的背包中的最大价值和, 那么根据上面关于第 i 件物品是否装入了背包的情况分析,我们得出关系式: 

      (1)当第I件物品要装入背包时,f(i,j) := (i-1件物品,限重为j-w[i]的最优解)+ v[i], 即: f(i,j) := f(i-1, j-w[i]) + v[i]

     当然,第i件物品要装入是有条件限制的:第i 件物品重量小于等于背包限重,即 w[i] <= j

    (2)当第i件物品不装入背包时,f(i,j) :=i-1件物品,限重为m的最优解,即: f(i,j) := f(i-1, j) 

     求得装入或者不装入第 i 件物品的限重为J的背包的最大价值,只需要比较这两种情况下谁的价值更大,更大者为当前问题的最优解。

      f(i,j)=max{ f(i-1, j-w[i]) + v[i] , f(i-1, j) }    该方程递归结束的边界条件是:当j=0时,f(i,0)=0。

      在按自底向上的动态规划方式求解问题时,其实主要就是做一件事:

      按问题规模从小到大地求解问题,把每阶段求得的问题的最优解保存在表格(数组)中,以便在下一阶段求解更大的问题时,可以直接查表引用子问题的最优解。 (类似于递推)

   阶段的分析:

        将n件物品放入背包,故可以把阶段划分为n个。把在前I件物品中选取物品放入背包作为第I个阶段。

   状态的分析:

        在第i 个阶段有多少个状态呢?因为包的容量为m,故在每个i 阶段都有m个状态:f(i,1)、f(i,2)、f(i,3)……f(i,m-1)、f(i,m)。

        而这m个问题的求解基础是第I-1个阶段的m个子问题。这些子问题的最优解已经先于此时求得,保存在f[I-1,1], f[I-1,2], …, f[I-1,m]中,现在只需要直接引用它们的值就可以了。这就是动态规划自底向上的体现。

         之所以能求得之前的状态,是因为有一个边界:f(i,0)=0。

   决策的分析:

         只有两个,在前I件物品中,限重为J的条件下,装入第I件物品还是不装入第I件物品。比较这两种情况的价值和,谁大谁就是最优解。

01背包问题 - Fly - 飛

转载自:http://www.cnblogs.com/gzydn/archive/2009/06/11/1501439.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值