题目:
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)
示例:
输入: n = 5 输出:2 解释: 有两种方式可以凑成总金额: 5=5 5=1+1+1+1+1
思路:这题刚开始用递归试了下,发现时间上不满足OJ要求,并且写的时候,思路也有点混乱,百思不得其解,后来看了其他的题解,觉得代码设计很巧妙,借鉴一下,它的思路是遍历硬币,先用最小硬币组合1-n,方程为dp[i] = dp[i] + dp[i-a[j]],这个方程咋看起来,貌似有点不理解,举个例子就方便些了,假如在求6的时候,我们知道dp[6]=2,为1,和1+5两种方式,而在求11的时候,依然只用1和5两种硬币,dp[11] = 1 + dp[6]= 3; 因为后面11到6,是先用最大硬币拆分的,所以计算的时候是没有重复的。代码如下:
int waysToChange(int n) {
int a[] = {1, 5, 10, 25};
vector<int> d(n+1, 0);
const int mod = 1e9 + 7;
d[0] = 1;
for(int j=0;j<4;j++){
for(int i=a[j];i<=n;i++){
d[i] = (d[i] + d[i-a[j]])%mod;
}
}
return d[n];
}
最后的结果注意要取模。