题意:
给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。
题解:
这题和 简单整数划分问题 思路一样。
可以把题目划分为子问题,只用一种硬币 来表示n分 , 用两种硬币来表示 n 分。
这样分有最优子结构和无后效性的特质。
进而可以确定状态用 前 j 种硬币表示i 分 的方法数。dp[i][j]
代码:
class Solution {
int M[5] = {0, 1, 5, 10, 25 };
int dp[1000002][5];
public:
int waysToChange(int n) {
for(int i= 1;i <= n; i++){
for(int j= 1;j <= 4; j++){
if (i > M[j]) dp[i][j] = dp[i - M[j]][j] + dp[i][j - 1];
else if (i == M[j]) dp[i][j] = dp[i][j - 1] + 1;
else dp[i][j] = dp[i][j - 1];
if (dp[i][j] >= 1000000007) dp[i][j] %= 1000000007;
}
}//extren for
return dp[n][4];
}
};