原題連接在這裏:https://leetcode.com/problems/coin-change/html
題目:post
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1
.url
Example 1:
coins = [1, 2, 5]
, amount = 11
return 3
(11 = 5 + 5 + 1)spa
Example 2:
coins = [2]
, amount = 3
return -1
.code
題解:htm
要求知足amount時用的最少coins數目. blog
Let dp[i] denotes amount == i 時用的最少coins數目. 用一維array儲存.leetcode
遞推時,狀態轉移dp[i] = Math.min(dp[i], dp[i-coins[j]]+1). dp[i-coins[j]]+1表示用最少個數coin表示i-coins[j].get
初始化dp[0] = 0. amount爲0時不須要硬幣. dp其餘值都是Integer的最大值, 以後會每次更新取最小值.it
Time Complexity: O(amount * coins.length).
Space: O(amount).
AC Java:
class Solution { public int coinChange(int[] coins, int amount) { if(amount == 0){ return 0; } if(coins == null || coins.length == 0){ return -1; } int [] dp = new int[amount+1]; dp[0] = 0; for(int i = 1; i<=amount; i++){ dp[i] = Integer.MAX_VALUE; for(int coin : coins){ if(i-coin<0 || dp[i-coin]==Integer.MAX_VALUE){ continue; }else{ dp[i] = Math.min(dp[i], dp[i-coin]+1); } } } return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount]; } }