// 动态规划 自底向上
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
// amount + 1 等同于赋值为无穷大
Arrays.fill(dp, amount + 1);
// base case
dp[0] = 0;
// 外层遍历所有状态
for (int i = 0; i < dp.length; i++) {
// 内层遍历求当前状态下的最小值,即最优子问题
for (int coin : coins) {
// 当前子问题无解 跳过
if (i - coin < 0) {
continue;
}
dp[i] = Math.min(dp[i], 1 + dp[i - coin]);
}
}
// 无解
if (dp[amount] == amount + 1) {
return -1;
} else {
return dp[amount];
}
}
}