[Leetcode][動態規划] 零錢兌換


一、題目描述

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

示例 1:

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

示例 2:

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

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

二、題目解析

//動態規划。狀態:dp[i]組合成i最少的硬幣個數
//初始狀態:dp[0]=0,其他的初始化為amount+1
//狀態方程:dp[i]=max(dp[i],dp[i-nums[j]]+1),0=<j<nums.size()&&i>nums[j]
//最終結果:dp[amount],或者-1時間復雜度amout*n

三、代碼

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        if (!amount)return 0;
        int n = coins.size();
        if (!n)return -1;
        vector<int>dp(amount + 1,amount+1);
        sort(coins.begin(), coins.end());
        dp[0] = 0;
        for (int i = 1; i <= amount; ++i) {
            for (int j = 0; j < n; ++j) {
                if (i < coins[j])continue;//邊界
                dp[i] = min(dp[i], dp[i - coins[j]] + 1);
            }
        }
        if (dp[amount] > amount)return -1;
        return dp[amount];
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM