背景
刚刚考完《数据结构与算法分析》这门课的期末考试,其中有一道证明题——0-1背包问题最优子结构的证明。因为当时上课的时候便比较“懵懂”,复习时候也没有认真看(个人对于ppt的证明过程抱有疑惑,现在回过头来看只是省略了一些介绍而已……太过于遗憾),果然拉垮了。但是本着至少要做到考后100分,便百度搜了搜,结果发现很少有人能够简单明了地证明这个正确性,自己思考了一番,有了自己的答案。
证明过程
0-1背包问题: 给定n中物品和一个背包,物品i的重量是wi,其价值为vi,xi代表是否选择这个物品(xi=1或0),背包的容量为C。如何选择装入背包的物品,使得装入背包中物品的总价值最大?
0-1背包问题等价于一个整数规划问题:
max
∑
i
=
1
n
v
i
x
i
\max \sum\limits_{{\rm{i = 1}}}^n {{v_i}{x_i}}
maxi=1∑nvixi
s
.
t
.
{
∑
i
=
1
n
w
i
x
i
≤
C
x
i
∈
{
0
,
1
}
,
1
≤
i
≤
n
(
∗
)
s.t.\left\{ \begin{array}{l} \sum\limits_{i = 1}^n {{w_i}{x_i} \le C} \\ {x_i} \in \{ 0,1\} ,1 \le i \le n \end{array} \right.(*)
s.t.⎩⎨⎧i=1∑nwixi≤Cxi∈{0,1},1≤i≤n(∗)
最优子结构:原问题的最优解包含子问题的最优解。
画重点了!!!!下边是证明:
———————————————————————————————————————————————————————
设(y1,y2,⋯,yn)是(∗)的一个最优解,则(y2,y3,⋯,yn)是下面子问题的最优解:
max
∑
i
=
2
n
v
i
x
i
\max \sum\limits_{i = 2}^n {{v_i}{x_i}}
maxi=2∑nvixi
s
.
t
.
{
∑
i
=
2
n
w
i
x
i
≤
C
−
w
1
y
1
x
i
∈
{
0
,
1
}
,
2
≤
i
≤
n
s.t.\left\{ \begin{array}{l} \sum\limits_{i = 2}^n {{w_i}{x_i} \le C - {w_1}{y_1}} \\ {x_i} \in \{ 0,1\} ,2 \le i \le n \end{array} \right.
s.t.⎩⎨⎧i=2∑nwixi≤C−w1y1xi∈{0,1},2≤i≤n
证明:(反证法)假设(z2,z3,⋯,zn)是上述子问题的最优解,即(y2,y3,⋯,yn)不是子问题的最优解——不存在最优子结构则:
∑
i
=
2
n
v
i
y
i
≤
∑
i
=
2
n
v
i
z
i
w
1
y
1
+
∑
i
=
2
n
w
i
z
i
≤
C
\begin{array}{l} \sum\limits_{i = 2}^n {{v_i}{y_i} \le } \sum\limits_{i = 2}^n {{v_i}{z_i}} \\ {w_1}{y_1} + \sum\limits_{i = 2}^n {{w_i}{z_i}} \le C \end{array}
i=2∑nviyi≤i=2∑nviziw1y1+i=2∑nwizi≤C
则有
∑
i
=
1
n
v
i
y
i
≤
∑
i
=
2
n
v
i
z
i
+
v
1
y
1
\sum\limits_{i = 1}^n {{v_i}{y_i} \le } \sum\limits_{i = 2}^n {{v_i}{z_i}} + {v_1}{y_1}
i=1∑nviyi≤i=2∑nvizi+v1y1
说明(y1,z2,z3,⋯,zn)是比(y1,y2,y3,⋯,yn)更优的一个解,与原假设矛盾!
解决你的疑惑
有的人会这么认为(我最开始也是这个疑惑):
假如面对第n个物品时候,背包剩余空间为5,此时第n个物品为占据空间6,价值为10的物品,可以将原来背包里面占据空间为1的,价值为2的物品换出来啊!并把第n个物品加进去,这样总价值多了10-2=8,这不就说明没有最优子结构了么?
而实际上,当你不考虑第n个物品时候(即在子问题中),你的背包容量也是将第n个物品所占体积减去后的容量(记住这句话,看完后面后可以回来再体会一下)
再看这个公式
s
.
t
.
{
∑
i
=
2
n
w
i
x
i
≤
C
−
w
1
y
1
x
i
∈
{
0
,
1
}
,
2
≤
i
≤
n
s.t.\left\{ \begin{array}{l} \sum\limits_{i = 2}^n {{w_i}{x_i} \le C - {w_1}{y_1}} \\ {x_i} \in \{ 0,1\} ,2 \le i \le n \end{array} \right.
s.t.⎩⎨⎧i=2∑nwixi≤C−w1y1xi∈{0,1},2≤i≤n
应该这样理解:
当你面对所有n个物品时,选择了一号物品即y1=1时,他的子问题便是背包总空间减去w1y1时候,选择后n-1个物品的最优解。就像上面疑惑中举出的例子,说明总体最优解包含第n个物品,说明在选择前n-1个物品的最优解时(子问题),此时背包容量仅为最初容量减去6,并考虑此时的最优解,此时的最优解也一定不会包括那个被“替换”出去的占据空间为1的,价值为2的物品,因为选择这件物品的话,面对第n个物品最后的空间会为5,而非要求的6(总体最优解中面对第n个物品时候需要的剩余容量)。