###找零钱的最少硬币数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]; }