考虑以下伪代码片段,其中
我已经阅读了很多关于这个特定问题的信息,但我仍然不明白为什么:
d
是面额值数组,k
是面额数量,n
是需要找零的金额。Change(d; k; n)
1 C[0] <- 0
2 for p <- 1 to n
3 min <- INFINITE
4 for i <- 1 to k
5 if d[i] <= p then
6 if 1 + C[p - d[i]] < min then
7 min <- 1 + C[p - d[i]]
8 coin <- i
9 C[p] <- min
10 S[p] <- coin
11 return C and S
我已经阅读了很多关于这个特定问题的信息,但我仍然不明白为什么:
1 + C[p-d[i]]
--> 我真的不明白这一部分,你为什么要使用它?能否有人给我解释一下!
p=4
时,你的C []
会像这样:{0: 0、1:1、2:1、3:2}
。这意味着单个硬币可以制作出1
和2
,而需要2个硬币才能制作出3
。因此,现在内部循环将尝试将C [4]
设置为某个值。它将尝试使用d [0]
,检查C [4-d [0]]
(即C [3]
,其等于2),并表示需要一个额外的面值为1
的硬币才能从3
制作出4
。它将设置C [4] = 3
,然后继续下一个硬币。下一个硬币是2
,所以算法将看到1+C [4-2]
小于C [4]
,并将C [4]
设置为2
。 - Sergey Kalinichenko