1. 程式人生 > >Leetcode題解系列——322. Coin Change(c++版)

Leetcode題解系列——322. Coin Change(c++版)

題目連結:322. Coin Change

題目大意:給出硬幣的面值以及所需要的總金額,試圖找到最少個數的找錢方式,這裡假設硬幣的個數都是無限個。

注意點:
1.可能存在無法找零的情況,注意判斷。
2.注意動態規劃陣列的下標是從1開始還是從0開始

一.演算法設計

這道也是典型的動態規劃題目,不能使用貪心演算法來解決。

設定陣列dp[i],表達找零總額為i的最少硬幣總數。
注意初始化給每一個金額先賦值為MAX值,方便後面判斷是否沒有找零的情況。

狀態轉移方程:dp[i] = min(dp[i], dp[i-coins[j]]+1);
表達為遍歷所擁有的硬幣,查詢需要該硬幣的前一個dp值+1後是否小於當前dp值,如果是則更換dp值。始終保持dp為當前金額的最小硬幣數

判斷是否無法找零,是通過對於最後的dp值,如果仍等於MAX值,則證明沒有辦法找到一個方案找零,返回-1.

二.演算法實現

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount+1);
        int csize = coins.size();
        for(int i = 1; i <= amount; i++) dp[i] = 10000;
        for(int
i = 1; i <= amount; i++){ for(int j = 0; j < csize; j++){ if(i >= coins[j]) dp[i] = min(dp[i], dp[i-coins[j]]+1); } } if(dp[amount] == 10000) return -1; else return dp[amount]; } };