簡體   English   中英

從集合中找到等於給定總和的數字組合-Python

[英]Find combination of numbers from set that equal a given sum - Python

編輯:我知道這個問題被問了一百萬遍,但是我似乎找不到適合我的特定情況的任何東西。 出於上下文目的,我在Windows操作系統上運行Python 3.6。

我嘗試了以下代碼:

def subset_sum(numbers, target, partial=[]):
    s = sum(partial)

    # check if the partial sum is equals to target
    if s == target:
        print(f"sum({partial})={target}")
        #print("sum({})={}".format(partial, target))
    if s == target:
        return  # if we reach the number why bother to continue

    for i in range(len(numbers)):
        n = numbers[i]
        #remaining = numbers[:i] + numbers[i+1:]
        remaining = numbers[i+1:]
        subset_sum(remaining, target, partial + [n])

s= [-765143.910000006, -14522903.45, -185360.52, -161161.559999994, -31947.78, 167450, 47715.46, -1725.24, -1532.91, 338381.23, -40962.19, -321.869999999997, -28215.17, -66345.71, 13063.28, -389.37, 6215992.30000001, 2193804.53000001, -458374.52, 106792.609999979, -335194.01, 203687.94, 91147.0500000003, -18.9500000000004, -19.1200000000016, -2.31494823310641]

k= [-2191.62999999806, 5481451.91, -17941.98, 166.719999999996, -2.72848410531878, -3.42659234320308, -13109322.84, -5320290.35000001, -977974.9, 2224562.69999999, 404360.300000002, 579934.88, 1131275.75, 3889264.3, 3364573.99000001, 5225874.59, 2191.62999999806, 176248.27, 19925.25, 2090.84, 11461.32, 3457.83, 4655.76, -17929.46, 449.48, 2187.61, 3084.35, 176274, 48909.78, 55.43]

x= [14795.41, 6497.05, 324.6, 5589.19, 2224.45, 5571.92, 3575.24, 3041.33, 4658.22, 6244.92, 433.59, 2146.55, 1489, 28686.93, 205, 2267.76, 1532.91, -12539.19, 46221.03, 9959.25, 20175.14, 735, 9449, 26880, 426.12, 1355.18, 220.48, 695.88, -389.99, -1.12, -37.56]

v= [-1.96999999999248, 1.58761892521397, -2.1600499167107, -2791.41999999999, 606814.85, -19.1200000000016, -1.49999999999995, -54.3300000000086, 34608.19, -661601.97, 3149949.45, 32247.78, 350.64, 328574.84, 42461.52, 1273, 6635.21, 504, -3100.27, 9868.07, 148179.28, 29205.46, -206.65, -552]

y = [s+k+x+v]

if __name__ == "__main__":
    subset_sum(y, -765143.910000006)

這條線

print(sum(%s)=%s) % (partial, target)

這是錯誤的,因為您對非字符串使用了字符串格式化模式。 你可能想做

print("sum(%s)=%s" % (partial, target))

仍然是舊語法,您還是希望使用新語法

print("sum({})={}".format(partial, target))

關於SyntaxError:您使用的格式化方式不正確。 PyFormat網站上可以找到更多有關此的快速解決方案:

print("sum(%s) =%s" % (partial, target)) 

您的代碼無效,因為

print(sum(%s)=%s) % (partial, target)

應該

print "sum(%s)=%s" %(partial, target)

此外,您需要在主聲明后縮進行

if __name__ == "__main__":
subset_sum([3,9,8,4,5,7,10],15)

應該是這個

if __name__ == "__main__":
  subset_sum([3,9,8,4,5,7,10],15)

同樣,您的代碼也無法完全正常工作,因為subset_sum([3,9,8,4,5,7,10,-9],1)即使應返回[10,-9] = 1也不會返回結果。

此外,為了改進您的代碼,我建議使用記憶化,以避免對大量數字進行相同子集計算的情況。

我相信這段代碼有效:

def subset_sum(numbers, target, partial=[]):
    s = sum(partial)
    if len(numbers) == 0:
        return
    elif s == target:
        print("sum({})={}".format(partial, target))
        return
    else:
        for i in range(len(numbers)):
            n = numbers[i]
            remaining = numbers[:i] + numbers[i+1:]
            subset_sum(remaining, target, partial + [n])

y = [-15, 5, 10, -10, 3, 7, -4, -2]

if __name__ == "__main__":
    subset_sum(y, 6)

隨着可能組合數量的增加,它可能會非常慢,您可以用數學方法進行計數並以天文數字的方式進行增長,因此您感覺它永遠不會結束。

注意:我沒有Python 3.6,因此這里的格式仍然是老式的。

編輯:另一個注意事項是,您永遠不要使用浮點數之間的相等性 ,例如在終止條件下使用建議的新輸入。 您可以查看此答案,以了解if isclose(s, target)條件的靈感。

暫無
暫無

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

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