方法1:
建立一个动态规划数组,数组长度为总金额+1,对应的数组用于记录与数组下标相对应的总金额所需要的最少硬币数。
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount +1];
Arrays.sort(coins);
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for(int i=1; i<=amount; i++){
for(int coin :coins){
if(coin > i)break;
if(dp[i-coin] == Integer.MAX_VALUE)continue;
dp[i] = Math.min(dp[i-coin]+1, dp[i]);
}
}
return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
}
}
方法2:
class Solution {
int ans=Integer.MAX_VALUE;
public int coinChange(int[] coins, int amount) {
Arrays.sort(coins);
dfs(coins,coins.length-1,amount,0);
return ans==Integer.MAX_VALUE?-1:ans;
}
public void dfs(int[] coins,int index,int amount,int cnt){
if(index<0){
return;
}
for(int c=amount/coins[index];c>=0;c--){
int na=amount-c*coins[index];
int ncnt=cnt+c;
if(na==0){
ans=Math.min(ans,ncnt);
break;//剪枝1
}
if(ncnt+1>=ans){
break; //剪枝2
}
dfs(coins,index-1,na,ncnt);
}
}
}