题目描述:给一些面额的硬币,要求用这些硬币来组成给定面额的钱数,并且使得硬币数量最少。硬币可以重复使用。
解题思路:
- 把该题目抽象成一个背包问题
- 物品:硬币
- 物品大小:面额
- 物品价值:数量
-
因为硬币可以重复使用,因此这是一个完全背包问题。
class Solution {
public int coinChange(int[] coins, int amount) {
if(coins==null||coins.length==0)
return -1;
int[] dp = new int[amount+1];
Arrays.fill(dp,amount+1);
dp[0] = 0;
Arrays.sort(coins);
for(int j = 1;j<=amount;j++){
for(int x:coins){
if(j>=x)
dp[j] = Math.min(dp[j],dp[j-x]+1);
}
}
return dp[amount]>amount?-1:dp[amount];
}
}