硬币问题(瓜子网二手车试题)
硬幣問題(瓜子網二手車試題)
有1分,2分,5分,10分四種硬幣,每種硬幣數量無限,給定n分錢(n <= 100000),有多少中組合可以組成n分錢?
我只知道使用多重for循環進行暴力求解,效率很低,數字高了后算不出來。
答案中提供了一個很巧妙的方法。但我看不懂。
幾經鉆研后,搞懂了。主要參考了這篇文章。
# python3 def change(coins, n):len1 = len(coins)if len1 == 0 and n < 1 or n > 100000:return Noneways = [0] * (n + 1) # 初始化ways[0] = 1for i in range(len1):for j in range(coins[i], n + 1):# 保證n小于等于100000,為了防止溢出,請將答案Mod 1000000007ways[j] = (ways[j] + ways[j - coins[i]]) % 1000000007print(ways[n])if __name__ == '__main__':coins, n = [1, 2, 5, 10], int(input())change(coins, n)我們應該都還記得邁臺階問題。一次性可以邁1-2階,遞推關系如下。
F(N)=F(N-1)+F(N-2)
那么對于硬幣問題,也可以視為一次增加1,2,5,10級臺階,最終湊到n階就可了。
那么是否有:
F(N)=F(N-1)+F(N-2)+F(N-5)+F(10)呢?
當然不是。例如在N-5級臺階的時候,此時到N的方法顯然不止一種。甚至可以說是有多種的。因而,也應該要把F(6)等給算上。
因為可以選擇的情況太多了,導致上面這種簡單的遞推關系式就不成立了。
因而我們嘗試讓任何時候都只有兩個選擇。從簡單的兩種硬幣1,2開始。
此時顯然有:
F(N)=F(N-1)+F(N-2)
F(1)=1
如果只使用硬幣1
F(N)=F(N)+F1(N-1)
其中F1是使用當前所有類型的硬幣的數目。
如果同時使用2
F(N)=F(N)+F1(N-1)
+F2(N-2)
其中F1來自硬幣1,F2來自硬幣2
此時如果把硬幣5加上。
F(N)=F1(N)+F2(N-5)
每一個點N可以如此構成,只含1的方法個數,只含1,2的方法個數,125方法個數,12510方法個數。
對任何一個F(N)只含一的方法個數一定是1。
含有2的方法個數就是從第一個可以被2更新的點3,每個點F(N)+=F(N-1)
最終還是發現問題描述不清楚。。。該死的。算了。
總結
以上是生活随笔為你收集整理的硬币问题(瓜子网二手车试题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧环保三维可视化决策系统平台(数字孪生
- 下一篇: 为什么程序猿996多猝屎,而企业家007