题目
思路
- 一开始是想将数组排序,然后从最大的开始减,减不够了就去上一个继续减。这种思路的问题在于经常出现不能全部兑换的情况,不能盲目选取最大的,这样往往出现不能换完的局面。
- 原本觉得动态规划会超时,结果看了一眼提示,最多只有12个硬币,且amount最高只为10^4,所以好像可以用。
- 那就比较简单了。在dp[i-coins[j]]不等于零的情况下,直接对比dp[i-coins[j]]即可。
代码
public int coinChange(int[] coins, int amount) {
if(amount==0) return 0;
Arrays.sort(coins);
int[] dp = new int[amount+1];
for(int i=1;i<amount+1;i++){
for(int j=0;j<coins.length;j++){
if(i<coins[j]) break;
else if(i==coins[j]){
dp[i]=1;
break;
}else{
if(dp[i]==0 && dp[i-coins[j]]!=0 ) dp[i] =dp[i-coins[j]]+1;
else if(dp[i-coins[j]]!=0) dp[i] = Math.min(dp[i],dp[i-coins[j]]+1);
}
}
}
if(dp[amount]==0) return -1;
return dp[amount];
}