Coin Change - Java 未能通过示例 3

Coin Change - Java Fail to pass example 3

问题:给你不同面额的硬币和总金额。编写一个函数来计算您需要最少的硬币数量来弥补该金额。如果那个数额的钱不能由硬币的任意组合组成,return -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:Input:硬币= [186,419,83,408],金额= 6249 输出:20 我的输出:-1

我没看懂这个例子。如果有人对这个例子有任何想法,或者除了我的算法之外还有其他更好的算法,请与我分享。

我看到了Coin Change (Dynamic Programming)link。但是看不懂。

我也研究过为什么贪心找零算法对某些币种不适用? 但无法理解它试图做什么 say.So 我提出了这个问题。

提前致谢。

您的代码使用的 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;