如果我們有面值為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
('面值:的最少硬幣使用數為:'
.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 元...