思路
动态规划
F(S):组成金额 S所需的最少硬币数量,硬币范围[0,n-1]
假设我们知道 F(S),即组成金额 S 最少的硬币数,最后一枚硬币的面值是 C。那么由于问题的最优子结构,转移方程应为:
F(S) = F(S - C) + 1 C的取值范围为[0,n-1]范围内的硬币面值 ,故我们只要取里面的最小值
public class Solution {
public int coinChange(int[] coins, int amount) {
int[] result = new int[amount + 1];
result[0] = 0;
for (int i = 1; i < amount + 1; i++) {
int min = Integer.MAX_VALUE;
for (int coin : coins) {
int res = i - coin < 0 ? -1 : result[i - coin];
if (res >= 0) {
min = Math.min(min, 1 + res);
}
}
result[i] = (min == Integer.MAX_VALUE) ? -1 : min;
}
return result[amount];
}
}