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:
Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:
Input: coins = [2], amount = 3
Output: -1
Note: You may assume that you have an infinite number of each kind of coin.
I thought the greedy strategy may be a good solution for this problem, but eventually I’m proved wrong, because greedy startegy is not able to ensure the consequence is always best, which is the biggest blemish. And dynamic programming is always the substitution of greedy strategy.
The following code is easy to understand.
int coinChange(vector<int>& coins, int amount)
{
if (amount <= 0)return 0;
vector<int> dp(amount + 1, 0);
for (int i = 1; i <= amount; i++)
{
for (int j = 0; j < coins.size(); j++)
{
if (coins[j] == i) { dp[i] = 1; break; }
if (coins[j] > i)break;
int temp = dp[i - coins[j]] + 1;
if (dp[i] == 0 || dp[i] == -1)dp[i] = temp;
else dp[i] = dp[i] < temp ? dp[i] : temp;
}
if (dp[i] == 0)dp[i] = -1;
}
return dp[amount];
}