法1:动态规划
// 时间复杂度:O(kN)
class Solution {
public int coinChange(int[] coins, int amount) {
// dp[i]表示从coins[0, i]范围内组合成i的最小硬币数量
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0;
for (int i = 1; i <= amount; ++i) {
for (int coin : coins) {
if (i >= coin) {
// min{不取当前coin, 取当前coin}
dp[i] = Math.min(dp[i], dp[i - coin] + 1);
}
}
}
return dp[amount] == amount + 1 ? -1 : dp[amount];
}
}