给定一组硬币,你如何以最优化的方式达到给定的金额?
假设在这种情况下,我们有 1、5、10、20 和 50 美分硬币的随机数,其中最大的硬币优先。
我的第一个直觉是使用所有可能适合的最大硬币,然后如果超过总和,则使用下一个价值最小的硬币。
这种方法会这样做还是有任何不足之处?有没有更有效的方法?
给定一组硬币,你如何以最优化的方式达到给定的金额?
假设在这种情况下,我们有 1、5、10、20 和 50 美分硬币的随机数,其中最大的硬币优先。
我的第一个直觉是使用所有可能适合的最大硬币,然后如果超过总和,则使用下一个价值最小的硬币。
这种方法会这样做还是有任何不足之处?有没有更有效的方法?
首先简单地分发最大的硬币是有缺陷的。
假设您的自动售货机已售完所有硬币,除了 50c、20c 和 1c 硬币各有 20 个,而您必须交付 60c 的零钱。
“优先级最大”(或贪婪)方案将给您 11 个硬币、1 个 50c 硬币和 10 个 1c 硬币。
更好的解决方案是三个 20c 硬币。
贪心方案只会给你局部最优解。对于全局最优,您通常需要检查所有可能性(尽管可能存在 minimax 类型的算法来减少搜索空间)以确定哪些可能性,对于交付更改,通常完全在可计算性的范围内。
每次用尽最大面额的假设不会是最好的解决方案。例子:
Input: coins[] = {25, 10, 5}, V = 30
Output: Minimum 2 coins required
We can use one coin of 25 cents and one of 5 cents
Input: coins[] = {9, 6, 5, 1}, V = 11
Output: Minimum 2 coins required
We can use one coin of 6 cents and 1 coin of 5 cents (min)
As per logic of exhausting largest coins first, we would end up with one
coin of 9 cents and 2 coins of 1 cent
请参阅此答案以获取更多说明。