一、題目描述
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1
。
示例 1:
輸入: coins =[1, 2, 5]
, amount =11
輸出:3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins =[2]
, amount =3
輸出: -1
說明:
你可以認為每種硬幣的數量是無限的。
二、題目解析
//動態規划。狀態:dp[i]組合成i最少的硬幣個數
//初始狀態:dp[0]=0,其他的初始化為amount+1
//狀態方程:dp[i]=max(dp[i],dp[i-nums[j]]+1),0=<j<nums.size()&&i>nums[j]
//最終結果:dp[amount],或者-1時間復雜度amout*n
三、代碼
class Solution { public: int coinChange(vector<int>& coins, int amount) { if (!amount)return 0; int n = coins.size(); if (!n)return -1; vector<int>dp(amount + 1,amount+1); sort(coins.begin(), coins.end()); dp[0] = 0; for (int i = 1; i <= amount; ++i) { for (int j = 0; j < n; ++j) { if (i < coins[j])continue;//邊界 dp[i] = min(dp[i], dp[i - coins[j]] + 1); } } if (dp[amount] > amount)return -1; return dp[amount]; } };