动态规划法—0-1背包问题(一)

0-1背包问题

  • 问题描述

    给定n个物品和一背包。物品i的重量是wi,其价值为vi,背包的容量为W。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?

  • 约束条件

    放入背包的物品的重量<=背包容量W
    物品只能进入背包或不进入背包,不可拆分,区别于部分背包问题。

  • 求解目标

    我们可以这样来刻画问题的解。
    假如有n个物品,用Xi表示第i个物品的状态。Xi 的值为0或1。0表示物品未进入背包,1表示物品进入背包。
    那么问题的解就是一个集合(X1,X2,X3,…,Xi,…,Xn) 。
    所以,我们就是要求,使背包总价值最大时,集合中各元素的值,是(0,0,1,…,0,…,1),还是(1,1,0,…,0,…,1)等等情况。

动态规划解决问题的思路

对于0-1背包问题,我们可以想象当背包容量很小的时候,可能进入背包的物品也相对变少(因为有些物品的重量已经超过了背包容量),那么为了使背包总价值最大,我们选择它进不进背包,就很容易。但是当背包容量相对较大时,可能进入背包物品的个数就会变多。问题就变得复杂。简而言之,当背包容量小的时候,可选项(可选择进入物品)较少,当背包容量大的时候,可选项变多。

动态规划法—0-1背包问题(一)_第1张图片

现在假设有5个物品,它们各自的重量都小于背包容量。可选项有5个,解的集合为(X1,X2,X3,X4,X5)。假设问题的最优解是(1,0,0,1,1)。如何能得出这个最优解呢?我们就从这5个里面随便拿出一个物品考虑,看看它在背包里的价值大,还是不在背包里的价值大。

我们刚假设了已经知道了最优解,假如我们拿出物品1来考虑,那么它在背包里的价值肯定大于它不在背包的价值。而假如我们拿出的是物品2来考虑,那么,它不在背包里的价值肯定大于它在背包里的价值,因为它未被选中。

我们现在用表达式来描述一个物品进入进入背包之后背包的总价值和不在背包里的总价值。假设该物品时第一个被考虑的。
进入背包:待考虑的可选物品在背包容量为W-wi时的最大价值+vi
不在背包:待考虑的可选物品在背包容量为W时的最大价值

如果该物品进入背包的总价值大于它不在背包的价值,我们就选中该物品,即认为最优解里包含该物品。

动态规划法—0-1背包问题(一)_第2张图片

针对上面的表达式,强调两点:
不论是动态规划法,还是贪心法,还是回溯法,它们都会用到分治思想(把大问题化解成小问题)。那么对进入背包这种情况:我们利用分治思想把大问题转化成背包容量为W-wi子问题+vi;不在背包这种情况,把大问题转化成背包容量为W的子问题+0。

  • 第一点:我们对两种不同情况都利用了分治思想,但是这两种情况下的子问题的是不一样的,因为这两个子问题的约束条件不一样,一个背包容量为W-Wi,另一个为W。

  • 第二点:我们看到要想求这两种情况下,谁的总价值大,必须依赖于前一个子问题的最优解。只有前一个子问题求解出来之后,当前问题才能解决。而在考虑前一个子问题的最优解时,我们还是以相同的方式,任选一个待考虑的物品,看它在背包里导致的子问题的价值大,还是不在里面导致的子问题的价值大。而在这个过程中,子问题的约束条件背包容量变得越来越小。那么回到我们最开始说的问题,当背包容量很小的时候,可选的物品就会变少,选择一个可选的物品在还是不在背包里就特别容易.

由于上述原因,我们就先从背包容量为0的时候开始考虑问题最优解,然后逐渐增大背包容量,直到能求出容量为W时候的最优解。而较大背包容量时候的最优解,依赖于前面较小背包容量时的解。

总结

当在几个可选的物品中选择谁应该进入背包时。思考的过程是:我们先拿一个物品考虑它在不在背包里,然后在此基础上,再接着考虑另一个物品在不在背包里的问题,在这个过程中背包容量是逐渐缩小的。而求解的过程是,先求出背包容量小的时候的解,再求出背包容量增大后的解,背包容量是逐渐增大的。背包容量逐步变化的这个过程就体现了动态二字。而每个子问题下都要比较在背包和不在背包哪个价值大,这个比较求最大价值的过程就是规划。

你可能感兴趣的:(算法,动态规划法,0-1背包问题)