動態規劃 硬幣找零(python3)

2021-10-06 12:32:08 字數 3047 閱讀 9703

如果我們有面值為1元、3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?

用d(i)=j 表示湊夠 i 元最少需要 j 個硬幣,求解過程如下:

當 i=0,表示湊夠0元最小需要0個硬幣

d(0)=0

當 i=1,只有面值為1元的硬幣可用,因此拿起乙個面值為1的硬幣,接下來只需要湊夠0元即可

d(1)=d(1-1)+1=d(0)+1=0+1=1

當 i=2,仍然只有面值為1的硬幣可用,於是拿起乙個面值為1的硬幣, 接下來只需要再湊夠2-1=1元即可

d(2)=d(2-1)+1=d(1)+1=1+1=2

當 i=3,能用的硬幣就有兩種了:1元的和3元的。此時就有兩種方案:

(1)如果拿了乙個1元的硬幣,目標就變為了:湊夠3-1=2元需要的最少硬幣數量

(2)如果拿了乙個3元的硬幣,目標就變成了:湊夠3-3=0元需要的最少硬幣數量

d(3)=d(3-1)+1=d(2)+1=2+1=3

d(3)=d(3-3)+1=d(0)+1=0+1=1

d(3)=min=1

題目:

假設有n種面值不同的硬幣,個個面值存於陣列 t[1:n] 中,現在用這些硬幣來找錢,各種硬幣的使用個數不限。求對於給定的錢數n,最少可以由幾枚硬幣組成,並輸出硬幣序列。

分析:

這是乙個典型的動態規劃問題,我們可以從1開始記錄下每個錢數所需的最小硬幣枚數。

實現:

def

coinchange

(values, valuescounts, money, coinsused)

:'''

:param values: 硬幣的面值

:param valuescounts: 硬幣對應的種類數

:param money: 給定錢數 n

:param coinsused: 對應於目前錢數 i 所使用的最少硬幣數目

:return: 對於給定錢數 n, 最少可以由幾枚硬幣組成, 並輸出硬幣序列

'''# 遍歷出從 1 到 money 所有的可能錢數

for cents in

range(1

, money+1)

: mincoins = cents # 從第乙個開始到money的所有情況初始

# 把所有的硬幣面值遍歷出來和錢數做對比

for kind in

range(0

, valuescounts)

:if values[kind]

<= cents:

temp = coinsused[cents - values[kind]]+

1if temp < mincoins:

mincoins = temp

coinsused[cents]

= mincoins

print

('面值:的最少硬幣使用數為:'

.format

(cents, coinsused[cents]))

if __name__ ==

"__main__"

: values =[25

,21,10

,5,1

] valuescounts =

len(values)

money =

30 coinsused =[0

]*(money+1)

coinchange(values, valuescounts, money, coinsused)

輸出:

/home/zhanglei/pycharmprojects/untitled/venv/

bin/python /home/zhanglei/catkin_ws/src/beginner_tutorials/scripts/t.py

面值:1的最少硬幣使用數為:

1面值:

2的最少硬幣使用數為:

2面值:

3的最少硬幣使用數為:

3面值:

4的最少硬幣使用數為:

4面值:

5的最少硬幣使用數為:

1面值:

6的最少硬幣使用數為:

2面值:

7的最少硬幣使用數為:

3面值:

8的最少硬幣使用數為:

4面值:

9的最少硬幣使用數為:

5面值:

10的最少硬幣使用數為:

1面值:

11的最少硬幣使用數為:

2面值:

12的最少硬幣使用數為:

3面值:

13的最少硬幣使用數為:

4面值:

14的最少硬幣使用數為:

5面值:

15的最少硬幣使用數為:

2面值:

16的最少硬幣使用數為:

3面值:

17的最少硬幣使用數為:

4面值:

18的最少硬幣使用數為:

5面值:

19的最少硬幣使用數為:

6面值:

20的最少硬幣使用數為:

2面值:

21的最少硬幣使用數為:

1面值:

22的最少硬幣使用數為:

2面值:

23的最少硬幣使用數為:

3面值:

24的最少硬幣使用數為:

4面值:

25的最少硬幣使用數為:

1面值:

26的最少硬幣使用數為:

2面值:

27的最少硬幣使用數為:

3面值:

28的最少硬幣使用數為:

4面值:

29的最少硬幣使用數為:

5面值:

30的最少硬幣使用數為:

2process finished with exit code 0

動態規劃 硬幣找零

時間限制 1000 ms 記憶體限制 65535 kb 描述在現實生活中,我們經常遇到硬幣找零的問題,例如,在發工資時,財務人員就需要計算最少的找零硬幣數,以便他們能從銀行拿回最少的硬幣數,並保證能用這些硬幣發工資。我們應該注意到,人民幣的硬幣系統是 100,50,20,10,5,2,1,0.5,0...

硬幣找零問題(動態規劃)

給定指定的硬幣種類,面值為 1,3,5 在此具體化些 給定所找零的錢數 sum,給出最少的硬幣找零數,每個種類的硬幣無限使用。看到這問題,當時我想到用貪心演算法來求解,最後求解方案因為巧合對了,後來在網上看到動態規劃的題目,才知道貪心演算法得不到最優解,比如 給定 面值為 1,3,4,給定找零數為 ...

動態規劃 硬幣找零思路

硬幣找零問題,有兩種。一種用貪心解決,一種用動態規劃解決。問題1 假設我們有 v1,v2,vn 單位是元 這些幣值的硬幣,它們的張數分別是 c1 c2 cn。我們現在要用這些錢來找零 w元,最少要用多少張紙幣呢?問題2 假設我們有幾種不同幣值的硬幣 v1,v2,vn 單位是元 如果我們要支付 w 元...