问题
一背包的最大重量b,有n种物品,每种物品的重量和价值分别为
w
i
w_i
wi和
v
i
v_i
vi,上述数字为正整数,在不超重的情况下,如何放物品能使价值最大。
问题实例:b=10,n=4,
w
1
w_1
w1=2和
v
1
v_1
v1=1,
w
2
w_2
w2=3和
v
2
v_2
v2=3,
w
3
w_3
w3=4和
v
3
v_3
v3=5,
w
4
w_4
w4=7和
v
4
v_4
v4=9
动态规划
子问题的界定:考虑前k种物品的分配,重量限制是y,如何使价值最大。原始问题对应的是k=n,y=b
子问题的计算顺序,k遍历由1至n,对确定的k,y遍历由1至b
优化函数的递推方程:
记
F
k
(
y
)
F_k(y)
Fk(y)代表相应的k和y时的最大收益,
F
k
(
y
)
F_k(y)
Fk(y)=max{
v
k
v_k
vk+
F
k
F_k
Fk(y-
w
k
w_k
wk)
递推方程的初始化:
F
0
F_0
F0(y)=0,
F
1
F_1
F1(y)=
⌊
y
w
1
⌋
\left \lfloor \frac{y}{w_{1}} \right \rfloor
⌊w1y⌋*
v
1
v_{1}
v1
F
k
−
1
F_{k-1}
Fk−1(y)},当y-
w
k
w_k
wk<0时,
F
k
F_k
Fk(y-
w
k
w_k
wk)=负无穷。
与投资问题类比,递推方程也可写作下列形式:
F
x
=
m
a
x
0
<
=
x
k
<
=
⌊
y
w
k
⌋
F
k
−
1
(
y
−
x
k
∗
w
k
)
+
x
k
∗
v
k
F_{x}=max_{0<=x_{k}<=\left \lfloor \frac{y}{w_{k}} \right \rfloor}{F_{k-1}(y-x_{k}*w_{k})+x_{k}*v_{k}}
Fx=max0<=xk<=⌊wky⌋Fk−1(y−xk∗wk)+xk∗vk
区别在于第一种递推方程的计算量小