找零問題求解

2021-10-09 22:55:21 字數 2104 閱讀 2493

今天我們來分享乙個大家都喜聞樂見的問題 –找零問題

為什麼說會喜聞樂見呢?這不想多了嘛,都跟你談錢了,還需要多說什麼嗎。

說到錢,我們就不說閒話了,直接來看下今天的分享內容吧。

首先來看如何使用貪心演算法來求解。以及何時可以使用貪心演算法求解。

栗子?:

假設當前有1、2、5、10、20、50、100等面額的紙幣,請你使用最少的紙幣數量來找零。

像這種問題的找零問題就可以使用貪心演算法來求解,因為所有的前置項相加的和不會超過當前元素。

如:1 + 2 < 5

1 + 2 + 5 < 10

1 + 2 + 5 + 10 < 20

**示例:

function

mincount

(amount)

return result

}

**解釋:

栗子?:

假設當前的紙幣金額只有1,5,11這三種,這樣的情況下我們適用貪心就不能取得最優解。 原因如下:

需要找零的金額為 15元,若使用上面的貪心演算法,就會出現11,1,1,1,1這種組合。

實際上我們只需要5,5,5三張紙幣就ok了。

於是,我們開了大招變了身,放棄了貪心演算法,通過動態規劃解決了這個問題。

let values =[1

,5,11

]function

mincoins

(amount)

if(values.

includes

(amount)

)// 查詢 values 中小於 amount 的所有值。

let middle = values.

filter

(item => item < amount)

for(

let i =

0,len = middle.length; i < len; i++)}

return min

}mincoins(15

)// 3

**解析:

繼續遞迴計算剩餘金額,需要的最小數量。

如果獲得的最小值小於min則更新min

將當前得到的最小值返回。

上面這種解法在執行過程中大家會發現乙個問題,即使當前金額之前做過計算,接下來還有相同金額的時候還需要重新計算,這樣就多了一層計算消耗。

解決的方法也很簡單,只需要將每次計算的結果快取下來即可。

let values =[1

,5,11

]let cache =

// 快取之前的結果

function

mincoins

(amount)

if(values.

includes

(amount))if

(cache[amount]

)return cache[amount]

// 如果有快取,直接取得快取中的結果

let middle = values.

filter

(item => item < amount)

for(

let i =

0,len = middle.length; i < len; i++)}

cache[amount]

= min // 將當前計算的最小值快取下來。

return min

}

這裡就是將我們計算得到的最小最做快取。

在每次求解之前檢視是否有快取本次金額的最小紙幣數量。

如果命中快取,則直接返回快取中的內容。

好了,以上就是我們本次分享的內容。希望本次分享的內容能為你帶來幫助喲。

下次再見,bye~

找零問題之貪心演算法求解Python

貪心演算法是基於區域性最優原理,將問題分割成若干個小的子問題,然後求解子問題的最優解,這樣歸併子問題的解,從而求得整個問題的解。當然這個解並不是最優解,只能說是近似最優解,因為區域性最優的合併並不一定是全域性最優。貪心演算法還有驗證解的步驟,這個比較簡單,就是把解帶入即可 找零問題,比如說售貨員需要...

找零問題之遞迴演算法求解改進Python

寫在前面,一定要弄清楚,字典的傳遞傳的是引用,是位址!這個小問題浪費了我將近兩個小時。等號複製,dict.copy 和copy模組的deepcopy 方法,這三個要搞清楚。前面提到了遞迴方法解決找零問題,但是當數值非常大,或者紙幣面值種類很多時,程式跑起來就會花費很多時間。我的筆記本配置比較低,面值...

買票找零問題

問題描述 一場激烈足球賽即將開始,售票員緊張地賣票著 每張球票50元,現在有2n 1 n 18 個球迷排隊購票,其中n個手持50元鈔票,另外n個手持100元鈔票。假設開始售票時售票處沒有零錢可以找零。問這2n個人有多少種排隊方式,不至使售票處出現找不出零的局面?例如當n 3時,共6人,3人持50元,...