【LeetCode】322-零錢兌換

題目描述

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

示例 1:函數

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

示例 2:spa

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

解題思路

  • 自頂向下找一下規律 code

  • 狀態轉移方程 F(i) = min{F(i - c_j)} + 1,j = 0...n-1blog

  • 自底向上解決問題 其中 F(0) = 0class

Java 實現

public int coinChange (int[] coins, int amount) {
    int[] dp = new int[amount + 1];
    Arrays.fill(dp, amount + 1);
    dp[0] = 0;
    for (int i = 1; i <= amount; i++) {
        for (int coin : coins) {
            if (coin <= i) {
                dp[i] = Math.min(dp[i], dp[i - coin] + 1);
            }
        }
    }
    return dp[amount] > amount ? -1 : dp[amount];
}

心得體會

這是一道典型的動態規劃的題目。先自頂向下找到規律,再經過狀態轉移方程描述這個規律,最後使用自底向上簡化時間複雜度。im

相關文章
相關標籤/搜索