這似乎是一個轉貼,但事實并非如此。大多數人要求提供配對號碼。我需要所有數字,而不僅僅是兩個。就像 n0 n1 n2 n3 n4 ... n100=x 而且,每個數字必須小于他之前的數字。例如對于 8 個輸出必須是:
There are 5:
7 1
5 3
6 2
5 2 1
4 3 1
在這里你可以看到 5>3 和 6>2,反之亦然。我非常接近這段代碼。我在stackoverflow上找到了這個,然后根據我的需要改進它。但是我在一臺超級計算機上測驗了它,如果你給它 200,它說它是錯誤的。我就是不明白這怎么可能是錯的?請問有人可以幫我改進嗎?用我的電腦需要很多時間。給這個 50,它仍然需要幾個小時。這是我的代碼:
from itertools import combinations
def solution(N):
array=[]
counter=0
for i in range(N):
if(i==0):
continue
array.append(i)
for K in range(N):
for comb in combinations(array, K):
if sum(comb) == N:
counter =1
#print(comb) uncomment this if you like, it prints pairs.
return counter
res=solution(50)
print(res)
順便說一句,我可以在沒有 itertools 的情況下做到嗎?也許它會導致問題。
uj5u.com熱心網友回復:
我想我可能已經找到了一個解決方案,我會分享它,也許您可??以與我核對它是否正確:) 我假設所有數字都必須小于 N。
首先,我不太確定您的代碼一定是錯誤的。我認為它會產生正確的答案,但也許您應該考慮發生了什么以及為什么您的代碼需要這么長時間。目前,您正在檢查總和的所有組合,但通過以另一種方式進行迭代,您可以排除許多可能性。例如,假設我的目標是找到所有結果為 8 的總和。假設我現在的總和為 6 5 = 11。目前,您在添加其他數字時仍在檢查所有其他可能性(即 6 5 4 和 6 5 3 等),但我們已經知道它們都將 >8,因此我們甚至不必計算它們。
作為一種解決方案,我們可以從比我們的目標小的最大數字開始,即我們示例中的 7。然后我們將嘗試所有數字小于這個的組合。一旦我們的總和大于 8,我們就不會進一步跟蹤。這聽起來很像遞回,這就是我目前實作它的方式。
獲得一個想法(我希望它是正確的,我還沒有對其進行廣泛的測驗):
def solution(goal, total_solutions=0, current_sum=0.0, current_value=None):
if current_value is None:
current_value = goal
# Base condition
if current_sum >= goal:
if current_sum == goal:
return total_solutions 1
return total_solutions
for new_value in range(current_value - 1, 0, -1):
total_solutions = solution(
goal, total_solutions, current_sum new_value, new_value
)
return total_solutions
res = solution(8)
print(res) # prints 5
因此,作為對您問題的回答,是的,您可以使用 itertools 來完成,但這將需要很長時間,因為您將檢查很多您并不真正需要檢查的總和。
我將這個程式與你的程式進行了比較,它產生相同的輸出,直到 N=30。但是后來你的代碼真的開始爆炸了,所以我不會進一步檢查。
uj5u.com熱心網友回復:
您正在尋找的答案在帖子中:編程挑戰:該演算法(與數論相關)如何作業?
經典方法在第 100 步開始需要一些時間,但使用記憶化(也稱為動態規劃)可以大大降低復雜性,并允許您的演算法在第 4000 步進行計算而無需花費任何時間。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350872.html
上一篇:scipy矩陣轉換檔案不清楚
