###找零錢的最少硬幣數java
Example 1: coins = [1, 2, 5], amount = 11 return 3 (11 = 5 + 5 + 1) Example 2: coins = [2], amount = 3 return -1.
####題目描述:code
給一些面額的硬幣,要求用這些硬幣來組成給定面額的錢數,而且使得硬幣數量最少。硬幣能夠重複使用。ip
- 物品:硬幣
- 物品大小:面額
- 物品價值:數量
####思路分析:leetcode
由於硬幣能夠重複使用,所以這是一個徹底揹包問題。徹底揹包只須要將 0-1 揹包中逆序遍歷 dp 數組改成正序遍歷便可。get
####代碼:io
public int coinChange(int[]coins,int amount){ if(amount==0||coins==null||coins.length==0) return 0; int []dp=new int[amount+1]; //dp[i]表示i能夠找零的最少硬幣數 for(int coin:coins){ for(int i=coin;i<=amount;i++){ if(i==coin){ dp[i]=1; }else if(dp[i]==0&&dp[i-coin]!=0){ dp[i]=dp[i-coin]+1; }else if(dp[i-coin]!=0){ dp[i]=Math.min(dp[i],dp[i-coin]+1); } } } return dp[amount]==0?-1:dp[amount]; }