背包问题
文章目录
- 背包问题
- 1 01背包问题
- 1.1 问题阐述
- 1.2 问题分析
- 背包问题中我最初的一些疑惑
1 01背包问题
我参考了文献背包九讲。https://github.com/tianyicui/pack/raw/master/V2.pdf 背包九讲的作者是ACM大牛崔天翼。
1.1 问题阐述
有 N N N件物品和一个容量为 V V V的背包,放入第 i i i件物品所需的容量 C i C_i Ci, 得到的价值是 W i W_i Wi。求解将哪些物品放入背包可以使得价值总和最大。
1.2 问题分析
“最大”关键词表明本题是一个最优化问题。在本题中,我们通过做出一组选择”对于每一件物品是否放入背包“,来达到最优解。为了便于阐述,我们可以给每一种物品进行编号,1,2,3,…,N. 对于物品 i i i,我们有两种选择,放或者不放。
在一个最优方案中,物品 i i i被放入背包还是没有被放入背包,都有可能。因为最优方案可能不止一个,同时要注意到的是:最优值只有一个。
令 F [ i , v ] F[i,v] F[i,v]为编号为1,2,3, … \dots …, i的物品放入容量为 v v v的背包所能够获得的最大价值。
(1)假设在一个最优方案中,我们将物品N放入了背包,则问题就转化为”编号为1,2,…,N-1的物品放入剩下容量为 V − C N V-C_N V−CN的背包中“,此时能够获得的最大价值就是 F [ N − 1 , V − C N ] F[N-1,V-C_N] F[N−1,V−CN]再加上放入物品 N N N获得的最大价值 W i W_i Wi,即 F [ N , V ] = F [ N − 1 , V − C i ] + W i F[N,V] = F[N-1,V-C_i] + W_i F[N,V]=F[N−1,V−Ci]+Wi. ”编号为1,2,…,N-1的物品放入剩下容量为 V − C N V-C_N V−CN的背包中“这个子问题只和物品 1 , 2 , … , N − 1 1,2,\dots, N-1 1,2,…,N−1相关,是一个独立的子问题。
(2) 假设在一个最优方案中,物品N没有被放入背包,那么问题就转化为”物品 1 , 2 , 3 , … , N − 1 1,2,3,\dots, N-1 1,2,3,…,N−1放入容量为 V V V的背包中“。 价值为 F [ N − 1 , V ] F[N-1,V] F[N−1,V].
然而我们并不知道是放入 D D D还是不放入 D D D能够取得最优值。有可能放入 D D D能够取得最优值,也有可能不放入 D D D能够取得最优值,还有可能放入 D D D或者不放入 D D D都可以取得最优值。例如,物品种数为4, 4中物品的容量均为3, 价值均为5,背包的容量为9,则任选3个物品即为一个最优解。
我们知道的是: F [ N , V ] = max ( F [ N − 1 , V − C N ] + W N , F [ N − 1 , V ) F[N, V] = \max (F[N-1,V-C_N]+W_N , F[N-1,V) F[N,V]=max(F[N−1,V−CN]+WN,F[N−1,V)
同时我个人对背包问题有一些理解。即背包问题的子问题几乎很少是重叠的子问题,使用自顶向下算法似乎更加高效。然而现有的算法大部分均是自底向上的。附上我自己推演的自顶向下的例子。
背包问题中我最初的一些疑惑
1 我们设F[i,j]考虑前i件物品,容量限制为j时背包所能装的最大价值。则递推公式需要考虑两种情况:
要么不放入第i件物品,则F[i,j] = F[i-1,j] 。
要么放入第i件物品,则F[i,j] = F[i-1, j- C i C_i Ci]
我们需要取这两者的最大值才是最终的F[i,j]。
即F[i,j] = max(F[i-1, j], F[i-1, j- C i C_i Ci]).
我的疑惑是:第i件物品后于第i-1件物品被考虑,是否会出现由于先装入了部分前i-1件物品所导致第i件非常有价值的物品无法被装入的情况?
答:之所以将N件物品进行一个先后的排序,主要是为了记录不同物品的重量和价值。然而,每当我们考虑一件新的物品时,该物品可以放,也可以不放。我们得到的最大价值是两种选择的最大值。所以不会出现返回的是非最优解。