题目:给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。
思路:这个问题真的非常有意思,需要用到递归的思想。假设现在有50分,求它的表示法。(1)50分可以用0个25分硬币,这下剩下的问题就是50分用10分、5分和1分表示;(2)50分用1个25分表示,问题转化为25分用10分、5分和1分表示;(3)50分用2个25分表示,这时候返回1。
所以可以看到这是一个递归的过程,刚开始时总是用25分硬币表示,递归一层后首选用10分来表示,所以递归函数的参数应该包括币的面额。每次递归之后总是跳转到用比当前小一点的面额表示,从25分跳转到10分,10分跳转到5分,5分跳转到1分,到用1分的时候,递归应该终止了,返回1,因为不管多少分用1分表示总是只有1种方法。
int MakeChange(int n, int denom)
{
int nextDenom = 0;
switch(denom)
{
case 25:
nextDenom = 10;
break;
case 10:
nextDenom = 5;
break;
case 5:
nextDenom = 1;
break;
case 1:
return 1;
}
int ways = 0;
for(int i = 0; i*denom <= n; ++i)
ways += MakeChange(n-i*denom, nextDenom);
return ways;
}