题目描述
有数量不限的硬币,币值为25分、10分、5分和1分,请编写代码计算n分有几种表示法。
给定一个int n,请返回n分有几种表示法。保证n小于等于100000,为了防止溢出,请将答案Mod 1000000007。
测试样例:
6
返回:2
2维dp
int countWaysV2(int n) {
int coins[] = {0, 1, 5, 10, 25};
//int dp[5][100001];
int (*dp)[100001] = new int[5][100001];
for(int i = 0; i < 5; ++i)
for(int j = 0; j < 100001; ++j)
dp[i][j] = 0;
for(int i = 0; i < 5; ++i)
dp[i][0] = 1;
for(int i = 1; i <= 4; ++i){
for(int j = 0; j <= n; ++j){
if(coins[i] <= j) dp[i][j] = (dp[i-1][j] + dp[i][j-coins[i]]) % 1000000007;
else dp[i][j] = dp[i-1][j];
}
}
int res = dp[4][n];
delete [] dp;
return res;
}
1维dp
int countWays(int n) {
int coins[] = {0, 1, 5, 10, 25};
int *dp = new int[100001];
for(int i = 0; i < 100001; ++i) dp[i] = 0;
// for(int i = 0; i <= n; ++i) cout << dp[i] << endl;
dp[0] = 1;
for(int i = 1; i <= 4; ++i){
for(int j = coins[i]; j <= n; ++j){
dp[j] = (dp[j] + dp[j-coins[i]]) % 1000000007;
}
} int res = dp[n];
delete [] dp;
return res;
}
cout << countWays(6) << endl; // 2
cout << countWays(35837) << endl; // 147219056
cout << countWays(60650) << endl; // 779292932
类似题目:
- https://projecteuler.net/problem=31
- 《程序员面试金典》 硬币表示