今天我們來分享乙個大家都喜聞樂見的問題 –找零問題
。
為什麼說會喜聞樂見呢?這不想多了嘛,都跟你談錢了,還需要多說什麼嗎。
說到錢,我們就不說閒話了,直接來看下今天的分享內容吧。
首先來看如何使用貪心演算法來求解。以及何時可以使用貪心演算法求解。
栗子?:
假設當前有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元,...