硬幣問題(瓜子網二手車試題)

2021-09-27 12:09:54 字數 1591 閱讀 4014

硬幣問題(瓜子網二手車試題)

有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 ...