1.v 是一个长度为 n 的列表,表示每个物品的价值。 , b4 y) X T( |; h7 z, Q( w2.w 是一个长度为 n 的列表,表示每个物品的重量。 0 w, \9 `/ r7 b' B) @, l# A3.n 表示物品的数量。9 U9 O1 u; e6 m) v
4.capacity 表示背包的容量。 7 G# p" s) [* q+ b) u5 P3 {5 F- Q% f6 w
代码首先初始化了一个二维数组 m 作为动态规划表,其中 m[j] 表示在考虑前 i 个物品时,背包容量为 j 时可以获得的最大总价值。数组 x 用来存储最终的解,x 表示是否选择第 i 个物品。
for i in range(n):5 n0 w) c; A) {) w/ W
for j in range(capacity):5 m/ n u' Q5 ^) P5 k# m
if (j >= w[i]):, u5 \8 \+ M5 o- d( N
m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i]) ; E4 v z; \: j# f\" L ~+ Z+ L
else:6 f/ _; p3 Q9 s6 B
m[i][j] = m[i - 1][j]
复制代码
在这个部分,代码使用了一个嵌套的循环,遍历了所有物品和不同的背包容量。对于每个物品 i 和容量 j,代码计算了两种情况下的最大总价值:2 R) c; u1 y5 ]1 _
5.如果当前物品的重量 w 小于等于当前容量 j,那么可以选择将第 i 个物品放入背包,此时总价值为 m[i-1][j-w] + v,或者选择不放入,此时总价值为 m[i-1][j]。代码选择其中较大的值作为 m[j]。 {6 [2 x+ Z5 s8 p9 `7 I4 m( I6.如果当前物品的重量 w 大于当前容量 j,则无法放入物品,所以总价值等于上一行的值 m[i-1][j]。) O# _: I" v I$ v* P
( L5 b2 _ [$ [! K8 W* Q8 s0 o
这个循环填充了动态规划表 m,最终 m[n-1][capacity] 包含了问题的最优解,即在给定容量下可以获得的最大总价值。
capacity = capacity - 1 ! S3 D9 x- o r
for i in range(n - 1, 0, -1):0 Q5 {2 |) ]) C/ ]2 R* Y/ V
if (m[i][capacity] == m[i - 1][capacity]): 1 R+ g: Q: ]7 c- |6 v6 K, t
x[i] = 0# O, b/ R5 L5 G% L5 m* U5 s% \' }: K
else:% E& n7 }( w- u: k
x[i] = 1, Y, W4 [( w0 r+ u- b
capacity -= w[i] $ E' x! v$ z2 N+ F- O F2 l. l8 B
x[0] = 1 if (m[1][capacity] > 0) else 0
复制代码
在这一部分,代码反向遍历动态规划表,从最后一行向前找到解的路径。如果 m[capacity] 等于 m[i-1][capacity],表示第 i 个物品没有放入背包,否则放入背包,并更新剩余容量 capacity。
weight = 0 $ t) W! e% J; g! {
value = 08 [, r! _ B2 @* @2 V, ?
print('装载的物品编号为:') ' P\" O4 b. w+ @' N, x+ t. x
for i in range(len(x)): & _ ^( R$ E# O' V
if (x[i] == 1): % F\" i8 N. S9 G/ S/ t$ p: V- _. r
weight = weight + w[i]+ p$ x7 R$ U1 m, h! g: V/ |* m