我会考虑逐步构建解决方案,以归纳方式:
可用的硬币有 1c、5c、10c、25c(您可以根据需要调整它们)
- 1c = 1 X 1c 的最小硬币。最多 4 美分,我们需要 1c 硬币,因为这是最小的面额。
- 5 美分,我们有一个 5c 硬币。结合上面的 4c,我们可以生成 1 到 9 之间的任意数字。
- 对于 10 美分,我们需要 1 X 10c。结合以上三者,我们可以生成 1 到 19 之间的任意数字。
- 对于 20c,我们需要 2 x 10c,因为 20 可以被 10 整除。
如果你能归纳出问题,解决它可能会更容易。
编辑:
好吧,这里再尝试解释一下动态规划解决方案:
想象一张表,其中有x 行(x 是不同面额的数量)和n 列(n 是您必须使用最少面额构建的数量)。此表中的每个单元格都代表一个不同的子问题,最终将包含它的解决方案。假设:
第 1 行代表集合 {1c},即在第 1 行中,您可以使用无限 1c
第 2 行表示集合 {1c, 10c},即在第 2 行中,您可以无限 1c 和 10c
第 3 行代表集合 {1c, 10c, 15c} 等等...
每列代表您要构建的数量。
因此,每个单元格对应一个小子问题。例如(为简单起见,索引从 1 开始),
cell(1, 5) ==> 构造 5c 仅使用 {1c}
cell(2, 9) ==> 构造 9c 使用 @987654336 @
cell(3, 27) ==> 使用{1c, 10c, 15c}构造27c
现在你的目标是得到cell(x, n)的答案
Solution:
从最简单的问题开始解决表格。解决第一行是微不足道的,因为在第一行中唯一可用的面额是{1c}。第 1 行中的每个单元格都有一个简单的解决方案,导致 cell(1, n) = {nx1c}(n 1c 的硬币)。
现在继续下一行。概括第二行,让我们看看如何解决(比如说)cell(2, 28),即使用{1c, 10c} 构造28c。在这里,您需要做出决定,是否在解决方案中包含10c,以及有多少硬币。你有 3 个选择 (3 = 28/10 + 1)
Choice 1:
取{1x10c} 和前一行的其余部分(存储在cell(1, 18) 中)。这给了你{1x10c, 18x1c} = 19 coins
Choice 2:
取{2x10c} 和前一行的其余部分(存储在cell(1, 8) 中)。这给了你{2x10c, 8x1c} = 10 coins
Choice 3:
不取10c 和前一行的其余部分(存储在cell(1, 28) 中)。这给了你{28x1c} = 28 coins
显然,选择 2 是最好的,因为它需要更少的硬币。把它写在桌子上,然后继续。表格将一次填满一行,并且在一行内按数量递增的顺序填满。
按照上述规则,您将到达cell(x, n),解决方案将是在n/p + 1 替代方案之间进行选择,其中p = 行中的最新面额x。最好的选择就是你的答案。
表格实际上是记住了小问题的解决方案,这样你就不需要一次又一次地解决它们。