貪心演算法經典問題 硬幣找零

2021-10-18 11:46:35 字數 1969 閱讀 1369

這是乙個用最少硬幣支付指定額度的問題。

一、問題描述:如下圖圖一,設有6種不同面值的硬幣,各硬幣的面值分別為5分、1角、2角、5角、1元、2元。現要用這些面值的硬幣來購物和找錢。購物時規定了可以使用的各種面值的硬幣個數。

假定商店裡各面值的硬幣足夠多,顧客也可用多種方式支付,在一次購物中希望使用最少硬幣個數。舉乙個例子,一名顧客需要付款,0.55元,但她身上沒有5角的硬幣,如下圖圖二所示,展示了一種情況,顧客用0.2+0.2+0.1+0.05共4枚硬幣來付款。

下圖圖三展示了另一種情況,顧客支付1元,商店找回4角5分。這個情況同樣需要4枚硬幣。

下圖圖四展示了最佳情況。如果顧客付出1.05元(1枚1元和1枚5分),商店找回5角,整個過程只需要3枚硬幣。這個方案用的硬幣個數最少。

二、提出問題

現在問題來了,對於給定的各種面值的硬幣個數和付款金額。如何計算使用硬幣個數最少的交易方案。

其核心思想為消費者硬幣數量有限,商店的硬幣無限。因此問題可以用以下公式來描述

min(消費者支付硬幣數量+商店找零硬幣數量)

支付值-找零值=商品值

對問題的求解轉換為尋找上面兩個問題的最優解。

這裡所用的貪心演算法為:max(消費者擁有的硬幣面值-商店擁有的硬幣面值)優先使用。

例如消費者擁有面值為2元的硬幣,商店擁有5分的硬幣,因max=2元 - 5分=195分。那麼上面所有的組合情況為:

2元(不找零的情況),2元-5分,2元-1角,……,5分(不找零的情況)

現在例如購買的商品是2元,那麼在上面的組合中使用2元優先,只用1個硬幣即可;假如商品是2元9角5分,從上面的序列中使用貪心演算法來選擇,那麼就是一枚2元的硬幣優先,那麼9毛5如何處理呢?因為上面的序列中存在「1元-5分」的情況,這是能夠使用的最大幣值(貪心),就用它了,那麼它是2枚硬幣,即支付1元找零5分,總共用了3枚硬幣。

三、貪心演算法可獲得最優解的證明

接下來驗證這個演算法的貪心選擇性和最優子結構性質,證明貪心演算法可以獲得最優解。

貪心選擇性:用貪心策略的選擇替代原來的選擇,如果能獲得更優解或同優解。那麼貪心策略就可以獲得最優解。

我們把相應的串行列出來(用「分」來表示):

c[]={200,195,190,180,150,100,95,90,80,50,45,30,20,15,10,5};

證明這個序列具有貪心選擇性質即可,這裡我們先用乙個簡單的例子來證明

c[]={10,5,2,1},這裡,c[i]的出現次數最多為{n,1,2,1},這樣才能得到最優解,因為面值為1的次數為2時,可以用乙個面值為2的硬幣只能選用2個,若選用了3個,可以用1枚面值為5和一枚面值為1的硬幣來代替。概括來講,如果c[i]超過一定數量,可以用更少的c[i-1]來代替,因此,優先選擇大的面值的話,就會用更少的硬幣數,因此滿足貪心選擇性質。

這裡回歸到問題的序列c[],容易看出,c[i]總可以用更大的c[i-1]或者配合一些小幣值來代替,但是數量<=c[i]的使用數量,因此,滿足貪心選擇性質當然在這個過程中要考慮消費者硬幣是否足夠的問題。

最優子結構的性質證明:設s[i]為各種硬幣使用數量,s[i]是商品**為n時的最優解,硬幣數為k。現在設某面值的硬幣數量減1:s[j]=s[j]-1;則新的s[i]是n-c[j]的最優解,硬幣數為m,即m<k-1;那麼對於n來說,t[i]的硬幣數加1應該是最少的硬幣數,即m+1<k-1+1=k,與k是最少硬幣數矛盾,故問滿足最優子結構性質。

四、最終**

找零問題的貪心演算法(**實現如下圖圖五)

硬幣找零問題 貪心演算法

問題 有1元 2元 5元 10元的硬幣無限多枚。現在要用這些硬幣來支付a 輸入 元,返回需要多少枚硬幣的找零序列。能找回高面值硬幣就先找回高面值硬幣。include include using namespace std class sulotion 用來儲存結果 int p coins.size ...

貪心演算法解硬幣找零問題

假如有一種貨幣,它有面值為1分 2分 5分和1角的硬幣,最少需要多少個硬幣來找出k分錢的零錢?按照貪心演算法的思想,需要不斷地使用面值最大的硬幣。如果要找零的值小於最大的硬幣值,則嘗試第二大的硬幣,依次類推。如下 include using namespace std define one 1 de...

python演算法之貪心演算法(硬幣找零問題)

貪心演算法遵循某種既定原則,不斷地選取當前條件下最優的選擇來構造每乙個子步驟,直到獲得問題最終的求解。即在求解時,總是做出當前看來最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是區域性最優解。利用貪心演算法解題,需要解決以下兩個問題。是問題是否適合用貪心法求解,即所求解問題是否具有貪心選...