給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:
你可以認爲每種硬幣的數量是無限的。
設置dp[i]爲金額爲i時的最小硬幣數,初始化全爲-1,dp[0] = 0,狀態轉移方程爲:
對於每個i,遍歷所有的硬幣(面值爲t),設置一個minCnt,選擇出最小的dp[i-t]+1作爲dp[i]的值。
int coinChange(vector<int>& coins, int amount) {
vector<int> dp(amount + 1, -1);
dp[0] = 0;
for (int i = 0; i <= amount; i++) {
if (i == 0) continue;
double minCnt = INT_MAX;
for (int j = 0; j < coins.size(); j++) {
if (i - coins[j] >= 0 && dp[i - coins[j]] != -1 && minCnt > dp[i - coins[j]]) {
minCnt = dp[i - coins[j]] + 1;
}
}
if (minCnt != INT_MAX) dp[i] = minCnt;
// cout << i<<" " << dp[i] << endl;
}
return dp[amount] == INT_MAX ? -1 : dp[amount];
}