有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。 给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。 测试样例: 6 返回:2
public:
int countWays(int n) {
/* 从币值大的硬币开始,每次取i个(i乘以币值要小于等于n), 然后接着去取币值比它小的硬币,这时就是它的一个子
问题了,递归调用。 具体来怎么来理解这个事呢?这样,比如我要凑100分,那我先从25分开始, 我先取0个25分,
然后递归调用去凑100分;再然后我取1个25分,然后递归调用去凑100-25 =75分;接着我取2个25分,
递归调用去凑100-25*2=50分……这些取了若干个 25分硬币然后再去递归调用,取的就是10分硬币了。
一直这样操作下去,我们就会得到, 由若干个25,若干个10分,若干个5分和若干个1分组成的100分,
而且, 这里面每种币值的数量都可以为0*/
if(n<=0)
return -1;
return countWaysCore(n,25);
}
int countWaysCore(int n,int demo)
{
int next_demo;
switch(demo)
{
case 25:
next_demo=10;
break;
case 10:
next_demo=5;
break;
case 5:
next_demo=1;
break;
case 1:
return 1;
}
int res=0;
for(int i=0;i*demo<=n;i++)
{
res+=countWaysCore(n-i*demo,next_demo);
}
return res;
}
};
为啥老说超时呢