1. 程式人生 > >基礎演算法——動態規劃之硬幣問題

基礎演算法——動態規劃之硬幣問題

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

1 求問題的最優解:最小的硬幣數

2 是否有子問題:coin(n)表示的最少硬幣數是是上一次拿時候的硬幣數最少。
注意:coin(n)是n元的最小硬幣數,最後一次可拿的硬幣數為1,3,5 則下一步
的最小硬幣數為 coin(n-coin_money[i]) 它的狀態變更不是按元數的,是按照上次拿的硬幣錢目

3 狀態轉移方程為 coin(n)= min(coin(n - coin_money[i]) + 1)

4 邊界問題(找到最後一個重複的問題) 這裡
coin(1)=1 ,coin(2)=coin(1)+coin(1)=2 coin(3)=min(1,coin(2)+1)
coin(4)=coin(3)+1 coin(5)=1

5 從上往下分析問題,從下往上解決問題。
"""
def coin(n): coin_money = [1, 3, 5] if n == 1 or n == 3 or n == 5: return 1 if n == 2 or n == 4: return 2 min_count = n for i in range(len(coin_money)): # 第一次先拿1,剩下的在前面的方法已經有了,剩下的為n-coin_money[1] # 第二次拿3,剩下的前面有了 # 第三次拿5,剩下的取前面的結果 # 維護一個min_count,是三者最小的數
count_num = coin(n - coin_money[i]) + 1 if count_num < min_count: min_count = count_num return min_count money = int(input()) print(coin(money))