[英]Find if a number is a possible sum of two or more numbers in a given set - python
辦公用品商店以5,8或24支包裝出售您喜歡的筆類型。 因此,例如,可以准確地購買13支筆(一個包裝為5個,第二個包裝為8個),但是不可能只購買11支筆,因為沒有5個,8個非負整數組合。為了確定是否可以精確地購買n筆,必須找到a,b和c的非負整數值,以便
5a + 8b + 24c = n
編寫一個名為numPens的函數,它接受一個參數n,如果可以購買5,8和24個單元的組合使得筆的總數恰好等於n,則返回True,否則返回False。
注意:上個月的中期考試中出現了一個問題。 我無法解決它,但仍在尋找解決方案。 任何幫助都將被接受。 python中的代碼或解決它的算法。 謝謝
這聽起來像是動態編程的理想選擇。
def numPens(n):
pen_sizes = [5, 8, 24]
results = [True]
for i in range(1, n+1):
results.append(any(i >= size and results[i - size] for size in pen_sizes))
return results[n]
這里的主要見解是:
例如,假設我們想知道我們是否可以獲得10筆,假設我們已經知道0到9的答案。那么,我們至少需要一個包才能這樣做。 然后有3個案例需要考慮:
最后一個是荒謬的,所以如果(並且只有)可以獲得5筆或獲得2筆,那么獲得10筆是可能的。 由於我們已經假設我們已經知道0到9的答案,我們可以解決問題(事實證明,5個筆是可能的,作為一個5的包,所以我們得出結論,10也是如此)。
因此,為了使自己處於我們總是得到較小n值的答案的情況下,我們從0的明顯答案開始。然后我們計算1的答案(因為我們已經得到0的答案,我們可以做這個)。 然后我們計算2的答案(因為我們已經有0和1,我們可以這樣做),依此類推,直到我們得到我們想要的n的答案。
這段代碼封裝了以前結果的實際計算結果:如果有任何包裝尺寸size
,那么它就會生成True
,這對於購買那個尺寸的包裝是有意義的(沒有得到i - size
的負數),我們以前找到了一種購買i - size
筆的方法。
any(i >= size and results[i - size] for size in pen_sizes)
其余代碼只是讓我們將結果存儲在results
列表中以供將來使用,並最終返回最終結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.