322. 零錢兌換

給你一個整數陣列 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算並返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1 。

你可以認為每種硬幣的數量是無限的。

示例 1:

輸入:coins = [1, 2, 5], amount = 11

輸出:3

解釋:11 = 5 + 5 + 1

示例 2:

輸入:coins = [2], amount = 3

輸出:-1

解析:

經典多重揹包問題,對於當前的揹包大小,遍歷每一個揹包重量,得到前面重量需要的最小值.

  1. class Solution {
  2. public:
  3. int coinChange(vector<int>& coins, int amount) {
  4. //多重揹包
  5. int n = coins.size();
  6. vector<int> dp(amount + 1,INT_MAX);
  7. dp[0] = 0;
  8. for(int i = 0; i <= amount; i++){
  9. for(int j = 0; j < n; j++){
  10. //如果前一個重量可以拼出來
  11. if(i >= coins[j]){
  12. if(dp[i - coins[j]] != INT_MAX)
  13. //轉移,當前所需的個數和拿完第j個需要個數最小值
  14. dp[i] = min(dp[i], dp[i - coins[j]] + 1);
  15. }
  16. }
  17. }
  18. return dp[amount] == INT_MAX ? -1 : dp[amount];
  19. }
  20. };