小例子
给你一个背包,在你面前有许多物品,包括:一个最新款的苹果手机、一个相机、一个笔记本电脑、一个锅、一根金条、一台电视、一个空调……,你可以拿任意的东西,但必须都装到背包里,你会怎么拿才能使拿到的东西最值钱?
抽象例子
有N种物品,设第1个物品的重量是W1,价值是V1;第2个物品的重量是W2,价值是V2;……第n个物品的重量是Wn,价值是Vn。背包的容量为C。
我们的目标:
- 所挑选的物品的重量和不能超过C
- 所挑选的物品价值和最大
数学描述
给定n种物品和一个背包。物品i的重量是Wi,价值是Vi,背包容量为C
C
>
0
,
w
i
>
0
,
v
i
>
0
,
1
⩽
i
⩽
n
C>0,w_i>0,v_i>0,1\leqslant i\leqslant n
C>0,wi>0,vi>0,1⩽i⩽n
求
(
x
1
,
x
2
,
.
.
.
,
x
n
)
,
x
i
=
0
或
1
求(x_1,x_2,...,x_n),x_i=0或1
求(x1,x2,...,xn),xi=0或1
- ∑ i = 1 n w i x i ⩽ C \sum_{i=1}^n w_i x_i \leqslant C ∑i=1nwixi⩽C
- m a x ∑ i = 1 n v i x i max\sum_{i=1}^n v_i x_i max∑i=1nvixi
性质
最优子结构性质
设 ( a 1 , a 2 , … … , a n ) 是 最 优 解 , 则 把 第 一 个 物 品 去 掉 的 子 问 题 的 最 优 解 是 ( a 2 , … … , a n ) 设(a_1,a_2,……,a_n)是最优解,则把第一个物品去掉的子问题的最优解是(a_2,……,a_n) 设(a1,a2,……,an)是最优解,则把第一个物品去掉的子问题的最优解是(a2,……,an)
这里解释一下什么是“把第一个物品去掉的子问题”:
有N-1种物品,设第1个物品的重量是W2,价值是V2;第2个物品的重量是W3,价值是V3;……第n-1个物品的重量是Wn,价值是Vn。
如果原问题的最优解中,拿了第一个物品(a1=1),则该子问题的背包容量为C-W1;没拿(a1=0),该子问题的背包容量为C。总之,该子问题的背包容量为C-W1*a1。
使用反证法证明
假
设
把
a
1
去
掉
的
子
问
题
的
最
优
解
不
是
(
a
2
,
…
…
,
a
n
)
,
而
是
(
b
2
,
…
…
,
b
n
)
假设把a_1去掉的子问题的最优解不是(a_2,……,a_n),而是(b_2,……,b_n)
假设把a1去掉的子问题的最优解不是(a2,……,an),而是(b2,……,bn)
此
时
:
∑
i
=
2
n
v
i
b
i
>
∑
i
=
2
n
v
i
a
i
⇒
v
1
a
1
+
∑
i
=
2
n
v
i
b
i
>
∑
i
=
1
n
v
i
a
i
此时:\sum_{i=2}^n v_i b_i > \sum_{i=2}^n v_i a_i \Rightarrow v_1 a_1 + \sum_{i=2}^n v_i b_i > \sum_{i=1}^n v_i a_i
此时:∑i=2nvibi>∑i=2nviai⇒v1a1+∑i=2nvibi>∑i=1nviai
而
且
:
∑
i
=
2
n
w
i
b
i
⩽
C
−
w
1
a
1
⇒
w
1
a
1
+
∑
i
=
2
n
w
i
b
i
⩽
C
而且:\sum_{i=2}^n w_i b_i \leqslant C-w_1 a_1 \Rightarrow w_1 a_1 + \sum_{i=2}^n w_i b_i \leqslant C
而且:∑i=2nwibi⩽C−w1a1⇒w1a1+∑i=2nwibi⩽C
所
以
:
∑
i
=
1
n
v
i
a
i
已
不
是
最
大
值
,
即
(
a
1
,
a
2
,
…
…
,
a
n
)
不
是
最
优
解
。
最
优
解
变
成
了
(
a
1
,
b
2
,
…
…
,
b
n
)
所以:\sum_{i=1}^n v_i a_i已不是最大值,即(a_1,a_2,……,a_n)不是最优解。最优解变成了(a_1,b_2,……,b_n)
所以:∑i=1nviai已不是最大值,即(a1,a2,……,an)不是最优解。最优解变成了(a1,b2,……,bn)
与
前
提
矛
盾
,
故
子
问
题
的
最
优
解
是
(
a
2
,
…
…
,
a
n
)
与前提矛盾,故子问题的最优解是(a_2,……,a_n)
与前提矛盾,故子问题的最优解是(a2,……,an)