方法:动态规划
①确定状态:dp[i] 表示凑成总金额 i 所需的最少硬币个数;
②转移方程:dp[i] = Math.min(dp[i], dp[i - coin] + 1);
③初始条件和边界情况:dp[i] = 0;
④计算顺序:因为dp[i] 由 dp[i - coin] 推出,所以从小到大遍历。
class Solution {
public int coinChange(int[] coins, int amount) {
//状态:dp[i]表示凑成总金额 i 所需的最少硬币个数
int[] dp = new int[amount + 1];
dp[0] = 0;//初始化
for (int i = 1; i <= amount; i++) {
dp[i] = Integer.MAX_VALUE;//初始化
for (int coin : coins) {
//如果i < coin,无解,跳过
//如果i >= coin并且dp[i - coin]有解时,获取dp[i]的最小值
if (i >= coin && dp[i - coin] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
}