原题连接在这里: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]; } }