经典指数          
原因
2266
浏览数
0
收藏数
 

有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。 给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。 测试样例: 6 返回:2

     举报   纠错  
 
切换
1 个答案

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;

}

};

为啥老说超时呢

 
切换
撰写答案