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
.
Note: You may assume that you have an infinite number of each kind of coin.
解題報告
這道題目的意思是從給出的數中找到若干個,使他們的和為一個定值。求所需的數的最小個數,如果不存在則輸出-1
。
這道題是典型的完全背包問題。
設想一下,對于值為x
的數,如果amount-x
可以被計算得到,那么也可以被
計算得到。于是得到遞推式:
dp[j] = min(dp[j], dp[j-coins[i]+1) //dp中存放的為計算得到j需要的最少的數字
初始條件
dp[0] = 0, dp[1..amount] = MAX;
代碼
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount+1,amount+1);
dp[0] = 0;
for (int i=0;i<coins.size();i++){
for (int j=coins[i];j<=amount;j++){
dp[j] = min(dp[j],dp[j-coins[i]]+1);
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
};