Coins:有1
美分、5
美分、10
美分和25
美分的硬币,每种硬币使用数量没有限制,求n
美分的所有组合方法。
根据常识,找零钱的时候都是先拿大的,然后再拿小的,所以这里先用25
美分的(当然先用1
分也可以)。根据n
,可以算出25
美分最多可以用n / 25
张,然后剩余的n - (n / 25) * 25
只是用剩余的3
种就可以了。
但是这种解法会超时,即使加上了记忆化搜索也超时,因此只能用动态规划,尝试用每一种新的硬币,去替换已经使用的硬币即可。
class Solution {
private:
const vector<int> Money = { 25, 10, 5, 1 };
const int MOD = 1000000007;
public:
int waysToChange(int n) {
vector<int> Way(n + 1, 0);
Way[0] = 1;
for(size_t m = 0; m < Money.size(); m++)
{
for(int i = Money[m]; i <= n; i++)
{
Way[i] += Way[i - Money[m]];
Way[i] %= MOD;
}
}
return Way.back();
}
};