Coin Change - Java 未能通过示例 3
Posted
技术标签:
【中文标题】Coin Change - Java 未能通过示例 3【英文标题】:Coin Change - Java Fail to pass example 3 【发布时间】:2019-01-10 04:09:26 【问题描述】:问题:给你不同面额的硬币和总金额。编写一个函数来计算组成该数量所需的最少硬币数量。如果该金额不能由任何硬币组合弥补,则返回-1。
示例 1:
输入:硬币 = [1, 2, 5],金额 = 11 输出:3 解释:11 = 5 + 5 + 1
示例 2:
输入:硬币 = 2,金额 = 3 输出:-1
You may assume that you have an infinite number of each kind of coin.
我的代码:
public int coinChange(int[] coins, int amount)
Arrays.sort(coins);
int new_amount=amount;
int count_coin=0;
int q=0,r=0,a=0;
int k=coins.length-1;
while(amount>0 && k>=0)
q = new_amount / coins[k];
count_coin = count_coin + q;
r = new_amount % coins[k];
new_amount=r;
a+=q*coins[k];
k--;
if(a==amount)
return count_coin;
else
return -1;
我的代码适用于给定的两个示例。在处理完这个例子后,我又做了一个测试用例。
示例 3:输入:硬币 = [186,419,83,408],金额 = 6249 输出:20 我的输出:-1
我无法理解这个例子。如果有人对这个例子或除我之外的任何其他更好的算法有任何想法,请与我分享。
我看到了Coin Change (Dynamic Programming) 链接。但是看不懂。
我也研究了Why does the greedy coin change algorithm not work for some coin sets? ,但看不懂它想表达什么。所以我提出了这个问题。
提前谢谢你。
【问题讨论】:
假设您在硬币数组中有 3 和 5。并且数量是6,那么你总是会先选择5,然后数量是1。使用递归函数并尝试回溯 Why does the greedy coin change algorithm not work for some coin sets?的可能重复 【参考方案1】:您的代码使用 greedy 方法,该方法不适用于任意硬币名义(例如,设置 3,3,4
无法生成答案 6)
改为使用动态规划方法 (example)
例如,制作长度为 amount+1
的数组 A
,用零填充,制作 A[0] = 1
并从第 n 个条目向下遍历每个名义硬币的数组,为每个单元格选择最佳结果。
伪代码:
for (j=0; j < coins.length; j++)
c = coins[j];
for (i=amount; i >= c; i--)
if (A[i - c] > 0)
A[i] = Min(A[i], A[i - c] + 1);
result = A[amount] - 1;
【讨论】:
但我首先是按面额排序的。所以现在他们有一个命令而不是任意命令。 在这种情况下排序有什么帮助? @Encipher? 排序后首先取的最大面额,然后用第二个最大面额调整其余金额。 @Encipher 所以,[3,3,4] 和 6,在第一次迭代之后,你得到 [3,3] 和 2 -> 那么呢? @Encipher Greedy+ 排序确实适用于某些集合,例如,对于大多数国家的硬币系统来说,2 的幂,但在一般情况下会失败。看看我的例子。选择4
阻碍了获得最佳答案3+3
以上是关于Coin Change - Java 未能通过示例 3的主要内容,如果未能解决你的问题,请参考以下文章
322. Coin Change java solutions