题目
动态规划
public class Main {
public static void main(String[] args) {
Main main = new Main();
int [] nums = new int[]{2};
main.coinChange(nums, 3);
}
public int coinChange(int[] coins, int amount) {
int [] dp = new int[amount + 1];
dp[0] = 0;
for (int i = 1; i < amount + 1; i ++) {
int tempMin = Integer.MAX_VALUE;
for (int j = 0; j < coins.length; j ++) {
int coin = coins[j];
int preKind = i - coin >= 0 ? dp[i - coin] : -1;
if (preKind < 0) {
continue;
}
tempMin = Math.min(preKind, tempMin);
}
if (tempMin == Integer.MAX_VALUE) {
dp[i] = -1;
} else {
dp [i] = tempMin + 1;
}
}
return dp[amount];
}
}
基本思路
-
目标金额i只能由某个金额j, 再选择一枚硬币后得到, 因此枚举所有的j, 找出最小的dp[j], dp[i] = min_dp[j] + 1; 注意dp[j]可能为-1的情况
-
注意一下边界