leetcode 322 (動態規劃)

題目:

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

 

示例 1:

輸入: coins = [1, 2, 5], amount = 11
輸出: 3 
解釋: 11 = 5 + 5 + 1


示例 2:

輸入: coins = [2], amount = 3
輸出: -1

 

說明:
你可以認爲每種硬幣的數量是無限的。


題解:

     這個題目只有amount一個限制,因此dp是個一維數組,表示在i塊錢下最少用多少硬幣,當然我們可以遍歷下當前可選的硬幣,看看有沒有比i塊錢小的數值,這樣就可以和之前的更小的amount建立聯繫了。總體比較簡單。

     

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        sort(coins.begin(),coins.end());
        vector<long>dp(amount+1,INT_MAX);
        
        dp[0] = 0;
        for(int i = 0;i<=amount;i++)
        {
            for(int j = 0;j<coins.size() && coins[j]<=i;j++)
            {
                dp[i] = min(dp[i],dp[i-coins[j]]+1);
            }
        }
        
        return dp[amount] == INT_MAX ? -1 : dp[amount];
    }
};

     

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章