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

(Java) LeetCode 322. Coin Change —— 零钱兑换

#2069:Coin Change(完全背包)

hdu 2069 Coin Change(完全背包)

hdu2069(Coin Change)

HDU-2016 Coin Change (母函数 | 多重背包)