public int coinChange(int[] coins, int amount) {
//初始化dp表
int[] dp = new int[amount+1];
//因为是求最小值,所以默认值是一个无穷大,对于本题,amount+1也是无穷大
for (int i = 0; i < amount+1; i++) {
dp[i]=amount+1;
}
//base case 最小的子问题
dp[0]=0;
//穷举所有潜在子问题,本题就是目标金额的子问题穷举
for (int i = 0; i < dp.length; i++) {
//每个子问题的可选列表
for (int coin : coins) {
//结束条件:目标金额-硬币面值
if(i-coin<0) continue;
//转移方程,1+子问题(花出去了一个币的机会,将当前问题转移到总金额-币面值的子问题)
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
//如果最终目标无解
return (dp[amount] == amount + 1) ? -1 : dp[amount];
}