在这个部分,代码使用了一个嵌套的循环,遍历了所有物品和不同的背包容量。对于每个物品 i 和容量 j,代码计算了两种情况下的最大总价值: ) B+ Y5 T; d( J# ]( D& O5.如果当前物品的重量 w 小于等于当前容量 j,那么可以选择将第 i 个物品放入背包,此时总价值为 m[i-1][j-w] + v,或者选择不放入,此时总价值为 m[i-1][j]。代码选择其中较大的值作为 m[j]。4 T3 b/ a6 D0 ]) F7 S2 \+ t
6.如果当前物品的重量 w 大于当前容量 j,则无法放入物品,所以总价值等于上一行的值 m[i-1][j]。 Q0 o8 h7 [6 v6 h0 a( ]7 ^
\' @* Z9 ?2 \2 } t5 `, F
这个循环填充了动态规划表 m,最终 m[n-1][capacity] 包含了问题的最优解,即在给定容量下可以获得的最大总价值。
capacity = capacity - 19 c4 O' ~( G# K7 ~0 N3 e& P5 [- a
for i in range(n - 1, 0, -1):. A\" N6 Y4 T+ |% F5 Z
if (m[i][capacity] == m[i - 1][capacity]):; }1 _: e\" H% _* [2 Z
x[i] = 0 : r7 |% L- K S9 V; O( e
else: 1 }3 W! ^9 Y: c* w; h1 A$ X
x[i] = 1. X7 ]! O; C. g Y6 L+ ~, R1 v
capacity -= w[i]7 N3 h; _- E! Z% F/ F% C E8 [
x[0] = 1 if (m[1][capacity] > 0) else 0
复制代码
在这一部分,代码反向遍历动态规划表,从最后一行向前找到解的路径。如果 m[capacity] 等于 m[i-1][capacity],表示第 i 个物品没有放入背包,否则放入背包,并更新剩余容量 capacity。
weight = 0 1 T3 p) J3 {1 h r
value = 0% s- R3 q\" \- I5 D k7 u( t# J
print('装载的物品编号为:')6 L* P2 r. \6 n* ]2 I2 }& X, ^( o
for i in range(len(x)):4 c7 X; e9 J5 o# z& b; b
if (x[i] == 1): . C1 p$ t. y& g8 x6 d6 g( l# [. d
weight = weight + w[i]\" S& y: I' N\" g1 g) W
value = value + v[i] 0 U/ F6 C6 c2 ]9 i6 o
print(' ', i + 1)9 ~4 \( O. V6 ?2 H9 Y8 j5 n
print('装载的物品重量为:') , g- a6 Z; ?; h9 {! u% Y
print(weight); E' A* ]8 u$ [/ t
print('装入的物品价值为:') - d+ j0 W, x7 _% ~
print(value) # Q8 c6 @! [0 W4 E: Z: b
return m
复制代码
最后,代码计算了被选择的物品的总重量和总价值,并将它们打印出来。函数返回动态规划表 m。6 y, g, b$ B; l! `0 O
这段代码实现了0-1背包问题的解决方法,它通过动态规划算法找到最优解,即在给定背包容量下可以获得的最大总价值,以及选择哪些物品放入背包。5 B. s. h6 Y. N" h7 a5 K