这是发布在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;
}
看着解决方案,我发现我的基本情况是正确的,但是我无法从问题陈述中得出递归/动态编程问题。我可以得到一些帮助将派生与代码相关联吗?
我确实读过一些相关的问题here,here,here等,但是我无法以可视化的方式理解递归,因此不必记住它!我可以帮忙吗?