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();
}
};
1533

被折叠的 条评论
为什么被折叠?



