程序员面试金典 8.11

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();
    }
};
发布了194 篇原创文章 · 获赞 2 · 访问量 7711

猜你喜欢

转载自blog.csdn.net/RayoNicks/article/details/105476162