题目来源:https://leetcode.cn/problems/gaM7Ch/
大致题意:
给一个硬币金额数组和一个总数,每一中硬币有无限多,求最少需要多少枚硬币可以组成总数,如果不能组成则返回 -1
思路
使用数组 dp[i] 表示组成金额为 i 需要的最少硬笔数,于是有状态转移方程:
dp[i] = min(dp[i - cj] + 1),其中 cj 表示某个硬币金额,且 i - cj >= 0
初始时,dp[0] = 0,即组成金额 0 所需的最少硬币数量为 0
代码:
public int coinChange(int[] coins, int amount) {
if (amount == 0) {
return 0;
}
int n = coins.length;
int[] dp = new int[amount + 4];
int MAX = Integer.MAX_VALUE;
// 初始化
Arrays.fill(dp, MAX);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < n; j++) {
// 当 i - coins[j] 不小于 0 且 i - coins[j] 可以通过硬币组成时,尝试更新 dp[i]
if (i - coins[j] >= 0 && dp[i - coins[j]] != MAX) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
// 若 dp[amount] 等于 MAX,表示没有合适数量的硬币组成 amount
return dp[amount] == MAX ? -1 : dp[amount];
}