了解硬币找零问题

时间:2020-10-13 04:57:11

标签: recursion dynamic-programming coin-change

这是发布在Internet上的解决方案的一个非常普遍的问题。有2个输入参数,一个数量和一个面额数组。我们需要找到使用给定面额计算总量的总方法。 例如

input: 
 - amount = 11
 - denominations = { 10, 5, 1 }
output:
 - total ways = 4

现在要解决此问题,我尝试扩展它:

total ways  = 11 using 1 dime + 11 using 0 dimes
            =  1 using {5, 1} + 11 using {5, 1}
            =  1 using 1 cent +  [*]
            =  1 way          +  [*]

[*] 11 using {5, 1} = 11 using 2 nickels + 11 using 1 nickel + 11 using 0 nickels
                = 1 using 1 cent     + 6 using 1 cents   + 11 using 1 cents
                = 1 way              + 1 way             + 1 way

// Thus replacing [*], I get 4 ways, which seems correct:
11 => 10 + 1
   => 5 + 5 + 1
   => 5 + 1+1+1+1+1 + 1
   => 1+1+1+1+1 + 1+1+1+1+1 + 1

从以上内容,我可以得出一个基本案例。金额基本上没有关系,如果面额为1,则总数为No。的任何数量(全部为1)的方式都是1。

if (denomination == 1) return 1; // assuming we are return no. of ways

但是我无法以代码形式找出其余的递归。

这是解决方案:

public static int coins(int , int[] denominations, int index) {
    if (index >= denominations.length) return 0;
    if (denominations[index] == 1) return 1; 

    int change = 0;
    int ways = 0;               
    while (change <= n) {
        ways += coins(n - change, denominations, index + 1);
        change += denominations[index]; 
    }
    
    return ways;
}

看着解决方案,我发现我的基本情况是正确的,但是我无法从问题陈述中得出递归/动态编程问题。我可以得到一些帮助将派生与代码相关联吗?

我确实读过一些相关的问题hereherehere等,但是我无法以可视化的方式理解递归,因此不必记住它!我可以帮忙吗?

0 个答案:

没有答案