題目:
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:
你可以認爲每種硬幣的數量是無限的。
題解:
這個題目只有amount一個限制,因此dp是個一維數組,表示在i塊錢下最少用多少硬幣,當然我們可以遍歷下當前可選的硬幣,看看有沒有比i塊錢小的數值,這樣就可以和之前的更小的amount建立聯繫了。總體比較簡單。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
sort(coins.begin(),coins.end());
vector<long>dp(amount+1,INT_MAX);
dp[0] = 0;
for(int i = 0;i<=amount;i++)
{
for(int j = 0;j<coins.size() && coins[j]<=i;j++)
{
dp[i] = min(dp[i],dp[i-coins[j]]+1);
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
};