此视频介绍了实现硬币零钱的实现。
https://en.wikipedia.org/wiki/Change-making_problem
我不清楚的地方是面试官从这里开始进行优化的细节。
https://youtu.be/HWW-jA6YjHk?t=1875
他建议使用面额[25,10,1]来制作最小数量的硬币,我们只需要使用该算法对超过50美分的数字进行零钱兑换,之后我们可以放心地使用25美分。因此,如果数字是$ 100.10,我们可以使用25美分,直到达到50美分为止,这时我们需要使用算法来计算精确值。
这对于给出[25,10,1]的面额列表是有意义的。为了获得断点图,他建议使用面额的LCM(在这种情况下为50)。
For example
32 - 25 * 1 + 1 * 7 = 8 coins. But with 10 cents we can do
32 - 10 * 3 + 1 * 2 = 5 coins.
因此,我们不能仅假设将在最小硬币数量计算中包括25美分。
这是我的问题-
假设我们有面额[25,10,5,1],则lcm仍然是50。但是,对于任何超过25美分的数字,都没有最小解决方案,其中不包括25。
例如-
32 - 25 * 1 + 5 * 1 + 1 * 2 = 4 coins.
32 - 10 * 3 + 1 * 2 = 5 coins
在这种情况下,断点不应该是25美分吗?而不是lcm?
感谢您的回答。
答案 0 :(得分:1)
值的LCM在“折点”上提供了最小上限,在该点上我们不能盲目地假定最高面额硬币是解决方案的一部分。少量数字理论将证明LCM是边界。
50是{25,10}的LCM。对于大于等于50的任何数量,包括至少5 * 10的任何组合都可以将该元素替换为2 * 25,从而减少硬币数量。该论点适用于所有其他硬币及其组合。这个简单的演示并不能普遍应用于以下 LCM;将会有很多作为反例。
为了使整体算法易于理解和维护,我们仅使用两个阶段:在该断点以上的最大硬币,以及在以下两个阶段的完整DP解决方案-在大多数情况下,即使是蛮力解决方案也通常足够高效出于实际目的。
答案 1 :(得分:0)
他们没有说当输入低于断点时我们不能使用25。他们建议一个好的优化方法是使用最高面额,直到我们将数量减少到折点为止(因为保证是该部分所需的最少硬币数量),然后切换到消耗更多资源的算法来计算剩余的所需硬币。