給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins =[1
,2,5
], amount =
11輸出:
3 解釋:11=
5+5+
1
示例 2:
輸入: coins =[2
], amount =
3輸出:
-1
說明:
你可以認為每種硬幣的數量是無限的。
思路:dfs+貪心:
首先題目要求總金額最小的硬幣個數,則貪心策略一定是先放入最大的硬幣,並且盡可能多的放,直到放不下,之後再去尋找小面值的硬幣,如果小面值的硬幣不能滿足要求,則回溯,逐個減少大面值的硬幣的個數,到滿足條件,當面值符合要求,判斷當前硬幣的個數是否比儲存的最小的個數少,如果是,則更新。
優化剪枝:在dfs遞迴過程中,如果發現當前已經使用的硬幣個數已經多餘儲存的最小個數,則當前這一組一定不可能是答案,即不用繼續下去。
ac**:
class
solution
if(c_index == coins.
size()
)return
;//使用完了所有的硬幣
for(
int k = amount / coins[c_index]
; k >=
0&& k + count < ans; k--)}
intcoinchange
(vector<
int>
& coins,
int amount)
};
思路2:
動態規劃,可以看成揹包容量無限,每件貨物質量為1的完全揹包問題。
定義dp陣列,其中dp[i]表示達到價值i所需要的最少的貨幣。
對每乙個i,遍歷所有可能使用的硬幣j,則dp[i]即為使用j號硬幣+要達到i-coins[j]所需要的最少硬幣,
最終去乙個最小的dp[i]儲存。
如題目中樣例coins = [1, 2, 5], amount = 11
所需要計算dp[11],而dp[11]=min(dp[11-1],dp[11-2],dp[11-5])+1.
ac**:(c++)
class
solution}}
if(dp[amount]
== int_max)
return-1
;else
return dp[amount];}
};
leetcode322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11輸出 3解釋 11 5 5 1 示例 2 輸入 coins 2 amount 3...
leetcode 322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...
LeetCode 322 零錢兌換
322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...