簡體   English   中英

三個數字的組合總計為1000

[英]Combinations for three numbers to sum up to 1000

我需要三個正整數的每個組合,總和為1000。

這是我的嘗試,但我不確定這是否正確,因為我無法驗證它。

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                l.append([x, y, total])
    return l

print len(getSum())

我得到了28776種不同的組合。 那是對的嗎?

由於1+998+11+1+998 不是一回事,因此有一些令人難以置信的組合:

這一行可以生成所有:

[(i, 1000-i-k, k) for i in range(1,999) for k in range(1,1000-i)]

結果:

[...
(1, 4, 995),
(1, 3, 996),
(1, 2, 997),
(1, 1, 998),
(2, 997, 1),
(2, 996, 2),
...]

這個清單的長度是:

498501

不,這個數字不正確。 你的代碼的問題是這一行:

        total = total-y

在這里,您可以降低total越走越用的每個值y你嘗試,它只是減去后從未重置價值x 要修復它,請創建一個新變量,例如total2 ,並在內部循環中使用它。

        total2 = total-y

這樣,您就獲得了498501組合。 此外,只要total2 < 0 ,就可以從內循環break


如果你只需要組合的數量 :注意有N-1組合將兩個數字相加到N ,例如對於N==41+3 2+2 3+1 (假設你考慮1+33+1不同)。 您可以將此擴展為三個數字的情況,將數字分為兩部分兩次。 這樣,您只需要一個循環。 並且這可以進一步簡化為O(1)公式。

例如,使用product作為參考的天真方法:

>>> N = 100  # to make reference faster
>>> sum(1 for t in product(range(1, N+1), repeat=3) if sum(t)==N)
4851
>>> sum(N-1-i for i in range(1, N-1))
4851
>>> ((N-2)*(N-1))//2
4851

當然,也適用於N = 1000 (或更多,更大):

>>> N = 1000
>>> sum(N-1-i for i in range(1, N-1))
498501
>>> ((N-2)*(N-1))//2
498501

如果你對[1,1,998]和[1,998,1]的處理方式相同(沒有唯一的整數):

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                z = [x, y, total]
                z.sort()
                if z not in l:
                    l.append(z)
return l

a = getSum()
print(len(a))

如果你想要3個唯一整數:

def getSum():
    l = []
    for x in range(1, 999):
        total = 1000-x
        for y in range(1, 999):
            total = total-y
            if total>0:
                z = [x, y, total]
                z.sort()
                if (z not in l) and (not((len(set(z)) < len(z)))):
                    l.append(z)
    return l

a = getSum()
print(len(a))

否則你的代碼(在我看來)是好的。 我還沒檢查你的答案......

編輯:我用殘酷的力量檢查了它。 如果您對(1,1,998)和(998,1,1)的處理方式不同,那么正確的答案實際上是498501。 目前我不知道為什么......

嘗試這個:

def getSum():
    l = []
    for x in range(1, 6):
        for y in range(1, 6):
            total = 6-(y+x)
            if total>0:
                s = set([x, y, total])
                if s not in l:
                    l.append(s)
                    print(x, y, total)
    return l

print (len(getSum()))

這是我的算法,雖然有更好的方法。 在這種情況下,我編寫了6號代碼並打印了所有組合以顯示它是如何工作的。 您可以在此代碼中設置1000或任何數字而不是6(在3位置)並忽略print()行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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