Recursion 理解硬币兑换问题

Recursion 理解硬币兑换问题,recursion,dynamic-programming,coin-change,Recursion,Dynamic Programming,Coin Change,这是发布在互联网上的解决方案的一个非常常见的问题。有两个输入参数,一个金额和一个面额数组。我们需要找到使用给定面额计算总金额的方法。 例如 现在为了解决这个问题,我尝试扩展它: total ways = 11 using 1 dime + 11 using 0 dimes = 1 using {5, 1} + 11 using {5, 1} = 1 using 1 cent + [*] = 1 way

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

现在为了解决这个问题,我尝试扩展它:

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,那么任何数量(全部为1)的方式总数将是1

但我无法以代码形式理解其余的递归

以下是解决方案:

公共静态整数硬币(整数,整数[]面额,整数索引){
如果(索引>=面值.length)返回0;
如果(面额[索引]==1)返回1;
int change=0;
int-ways=0;

当改变考虑一个特定面额在你的面额数组中时,一个给定的硬币组合至少包含一个面额的硬币,或者不调用。调用<代码> NbWess(s,n)< /代码>使用第一个<代码> n+1 < /代码>面额的方式求和“代码> S/<代码>的数量,这给出公式<代码> NbWess(s,n)。=N个通道(S-面额[N],N)+N个通道(S,N-1)
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
if (denomination == 1) return 1; // assuming we are return no. of ways