leetcode 322 零錢兌換

2021-10-05 17:57:40 字數 1377 閱讀 3023

給定不同面額的硬幣 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...