簡體   English   中英

查找一個數字是否是給定集合中兩個或更多個數字的可能總和--python

[英]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]

這里的主要見解是:

  1. 可以實現0筆(平凡:每種尺寸0包)。
  2. 如果我們已經知道少於n筆的答案,我們可以弄清楚是否可以獲得筆。

例如,假設我們想知道我們是否可以獲得10筆,假設我們已經知道0到9的答案。那么,我們至少需要一個包才能這樣做。 然后有3個案例需要考慮:

  1. 一包5 +然而我們得到5筆,如果它可以得到5筆。
  2. 一包8 +然而我們得到2筆,如果它可以獲得2筆。
  3. 一包24 +但我們得到-14筆,如果它可以得到-14筆。

最后一個是荒謬的,所以如果(並且只有)可以獲得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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM