​https://leetcode-cn.com/problems/coin-change/​

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

**输入:**coins = [1, 2, 5], amount = 11 **输出:**3 **解释:**11 = 5 + 5 + 1

**输入:**coins = [2], amount = 3 输出:-1

**输入:**coins = [1], amount = 0 **输出:**0

要求

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2^31 - 1
  • 0 <= amount <= 10

这道题就是一个背包问题,思路和之前的完全平方数也类似,二重循环,主要是找对第二重循环是啥,这里循环的就是硬币列表。

class Solution {
public int coinChange(int[] coins, int amount) {
int n = coins.length;
int[] dp = new int[amount + 3];
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
int a = Integer.MIN_VALUE;
dp[i] = -1;
for (int j = 0; j < n; j++) {
if (i >= coins[j]) {
int b = i - coins[j];
if (dp[b] != -1) {
if (a == Integer.MIN_VALUE) {
a = dp[b];
}
a = Math.min(dp[b], a);
}
}
}
if (a != Integer.MIN_VALUE) {
dp[i] = a + 1;
}
}
return dp[amount];
}
}