硬幣問題(瓜子網二手車試題)
有1分,2分,5分,10分四種硬幣,每種硬幣數量無限,給定n分錢(n <= 100000),有多少中組合可以組成n分錢?
我只知道使用多重for迴圈進行暴力求解,效率很低,數字高了後算不出來。
答案中提供了乙個很巧妙的方法。但我看不懂。
幾經鑽研後,搞懂了。主要參考了這篇文章。
# python3
defchange
(coins, n)
: len1 =
len(coins)
if len1 ==
0and n <
1or n >
100000
:return
none
ways =[0
]*(n +1)
# 初始化
ways[0]
=1for i in
range
(len1)
:for j in
range
(coins[i]
, n +1)
:# 保證n小於等於100000,為了防止溢位,請將答案mod 1000000007
ways[j]
=(ways[j]
+ ways[j - coins[i]])
%1000000007
print
(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)
最終還是發現問題描述不清楚。。。該死的。算了。
瓜子二手車推出二手車新零售業務
瓜子二手車今日宣布,正式推出二手車新零售業務 瓜子保賣體驗店,通過線上大資料 流量,線下實體店的聯動,實現交易效率大幅提公升的同時帶動交易規模的提公升。瓜子保賣體驗店 車輛均來自個人賣家,買賣雙方一口價交易。賣車車主可提前拿到瓜子先行墊付的大額預付車款,節約售車時間 買家可一次多看大量優質個人車源,...
二手車專案(二)
sale應用中 urls.py 1 encoding utf 8 2 author freshman 3 4from django.conf.urls import url,include56 from sale import views78 9 urlpatterns 10 汽車品牌列表 11 u...
二手車專案(四)
新增到購物車 param request return 驗證使用者是否登入 ifrequest.user.is authenticated car id request.get carid print car id car id try car carinfo.objects.get id car ...