322. 零錢兌換
給你一個整數陣列 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。
計算並返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1 。
你可以認為每種硬幣的數量是無限的。
示例 1:
輸入:coins = [1, 2, 5], amount = 11
輸出:3
解釋:11 = 5 + 5 + 1
示例 2:
輸入:coins = [2], amount = 3
輸出:-1
解析:
經典多重揹包問題,對於當前的揹包大小,遍歷每一個揹包重量,得到前面重量需要的最小值.
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
//多重揹包
int n = coins.size();
vector<int> dp(amount + 1,INT_MAX);
dp[0] = 0;
for(int i = 0; i <= amount; i++){
for(int j = 0; j < n; j++){
//如果前一個重量可以拼出來
if(i >= coins[j]){
if(dp[i - coins[j]] != INT_MAX)
//轉移,當前所需的個數和拿完第j個需要個數最小值
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}
};