題目
You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
思路
核心:動態(tài)規(guī)劃
dp[amount]:表示當(dāng)前amount的最小硬幣組合數(shù)
狀態(tài)轉(zhuǎn)移方程:dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)
比較兩種情況:1. 不取當(dāng)前的硬幣盗蟆,dp[i]
2. 取當(dāng)前硬幣的話御滩,dp[i - coins[j]] + 1
代碼
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
int[] dp = new int[amount + 1];//當(dāng)前amount需要的硬幣數(shù)
for (int i = 1; i < dp.length; i++) {
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
if (i >= coins[j] && dp[i - coins[j]] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}