思路如下:
1、典型的动态规划自下而上
2、dp数组定义:dp[i]表示i元能兑换的最小零钱个数
class Solution {
public int coinChange(int[] coins, int amount) {
if(coins.length==0){
return -1;
}
int[] dp=new int[amount+1];
dp[0]=0;
//自下而上遍历
for(int i=1;i<=amount;i++){
//每次存储一个最小值,为当前总数所需要的最小兑换零钱数
int min=Integer.MAX_VALUE;
//遍历每种零钱
for(int j=0;j<coins.length;j++){
//只有钱数大于零钱数才可找零
if(i-coins[j]>=0&&dp[i-coins[j]]<min){
//添加一个当前遍历的零钱
min=dp[i-coins[j]]+1;
}
}
//记录最小零钱数
dp[i]=min;
}
return dp[amount]==Integer.MAX_VALUE?-1:dp[amount];
}
}
原题地址:
322. 零钱兑换