題目描述
給定不一樣面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算能夠湊成總金額所需的最少的硬幣個數。若是沒有任何一種硬幣組合能組成總金額,返回 -1
。java
示例 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-1
blog -
自底向上解決問題 其中 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