在这个部分,代码使用了一个嵌套的循环,遍历了所有物品和不同的背包容量。对于每个物品 i 和容量 j,代码计算了两种情况下的最大总价值:+ g/ w3 h$ N' B+ T3 r
5.如果当前物品的重量 w 小于等于当前容量 j,那么可以选择将第 i 个物品放入背包,此时总价值为 m[i-1][j-w] + v,或者选择不放入,此时总价值为 m[i-1][j]。代码选择其中较大的值作为 m[j]。* y7 u; K/ `1 Z2 w& e
6.如果当前物品的重量 w 大于当前容量 j,则无法放入物品,所以总价值等于上一行的值 m[i-1][j]。 6 `8 q" y% s. }' s 8 G1 K3 \9 X' I这个循环填充了动态规划表 m,最终 m[n-1][capacity] 包含了问题的最优解,即在给定容量下可以获得的最大总价值。
capacity = capacity - 1) z6 g8 i8 {8 q0 |
for i in range(n - 1, 0, -1): 4 H# R1 j, k- i0 ^3 a# l# B
if (m[i][capacity] == m[i - 1][capacity]):- n3 z& c. H7 w; x7 Y* b0 c
x[i] = 0& o: L7 U8 ^3 r3 m2 Y4 Z5 h3 B
else: ; B7 d) V, L7 K
x[i] = 1, M2 p- ^; {; d4 D) A/ D) N. i
capacity -= w[i] 4 M' ^; h4 _1 p+ f
x[0] = 1 if (m[1][capacity] > 0) else 0
复制代码
在这一部分,代码反向遍历动态规划表,从最后一行向前找到解的路径。如果 m[capacity] 等于 m[i-1][capacity],表示第 i 个物品没有放入背包,否则放入背包,并更新剩余容量 capacity。
weight = 0. ]\" ?2 B: g- w\" i
value = 0- U' L4 c% m2 T+ }
print('装载的物品编号为:') 3 r$ ]% l A6 C, R/ Y1 ?+ P6 x
for i in range(len(x)): 7 e6 w( p; ]: i\" e( ^/ i) `