Skip to content

leetcode 322. 零钱兑换

我的解题

这个问题在 labuladong 动态规划详解 中,给出了非常详细的解释。

通过"状态、选择、base case"可以思考出"状态转移方程"。

#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
    int coinChange(vector<int> &coins, int amount)
    {
        vector<int> dp_table(amount + 1, amount + 1); // dp table,记录解,即最少的个数
        dp_table[0] = 0;
        for (int i = 1; i <= amount; ++i) // 金额,它对应的是状态
        {
            for (auto &&coin : coins)
            {
                if (i - coin < 0)
                    continue;
                dp_table[i] = min(dp_table[i], 1 + dp_table[i - coin]);
            }
        }
        return dp_table[amount] == amount + 1 ? -1 : dp_table[amount];
    }
};

int main()
{
    vector<int> n { 1, 2, 5 };
    int amount = 11;
    Solution s;
    cout << s.coinChange(n, amount) << endl;
}
// g++ test.cpp --std=c++11 -pedantic -Wall -Wextra