0/1 背包问题

Posted fengxiaozi-liu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0/1 背包问题相关的知识,希望对你有一定的参考价值。

假设小偷要去带着一个容量为8的背包去偷物品,总共有四件商品,请他能偷的最大价值是多少?

物品的价值如下:

技术图片

这里我们用b(i,j)来表示拿取的物品,i表示可以拿取前几件,不是要往背包里面装几件,j表示背包的容量是多少

在背包容量不能放下第i件物品的情况下:

  它所对应的最大价值就是就是对前i-1件的最优考虑因此第i件物品的最大价值可以理解为b(i,j) = b(i-1, j)

在背包容量能放下第i件物品的情况下:

  我们需要考虑往背包内放入这件物品的价值大,还是不放这件物品的价值大

  当我们不放这件物品的时候其价值为:

    b(i,j) = b(i-1,j) 我们不放这件物品就相当于只考虑前i-1件物品

  当我们放这件物品的时候价值为

    b(i,j) = b(i-1,j-w[i]) +p(i) 当我们放入这个物品后,包中的容量变成b-w[i],我们要考虑的物品也就变成了前i-1件,我们要求的最大价值就变成了b(i-1,j-w[i]) + 当前物品的价值p(i)

综上所述:

  背包中的最大价值算法为:

    1.不能放下当前第i件物品

      b(i,j) = b(i-1,j)

    2.能放下当前物品

      max(b(i-1,j), b(i-1,j-w[i])+p(i),能放入的时候考虑放与不放的价值哪个大

 

以上是关于0/1 背包问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 算法主题系列之集结0-1背包问题的所有求解方案

动态规划-多重背包问题

背包问题(0-1背包+完全背包)

0-1背包问题 —— 四种解法解题

背包问题之0-1背包

背包0-1背包与完全背包一维数组实现