簡體   English   中英

找到一個值的子集的最佳近似值

[英]Find the best approximation of a subset for a value

我想獲得一種算法,該算法可為我提供基於子集的值的最佳近似值。

這是一個例子:

N = 45

subset = [25,10,65,9,8]

output: [25,10,9]

重要的一點是算法必須給出最好的近似值(不管最終結果中元素的個數)。 結果必須提供給出最接近精確值的關聯(但不能超過初始值)。

您知道可以用最少的時間成本做到這一點的算法嗎?

非常感謝你的幫助。

你不能在多項式時間內這樣做(除非 P=NP)

找出是否存在總和恰好為 N 的子集顯然比找到總和最接近 N 的子集更容易,前一個問題稱為子集和,已知是 NP 完全問題。

然而,偽多項式時間是可能的。 事實上,如果我們將subset中的值同時作為 weights 中的值以轉換為背包,則您的問題完全等於0/1 背包優化問題 這個 0/1 背包問題有一個在O(nW)中運行的動態規划解決方案,其中nsubset的項目數, W是目標,在您的代碼中是N

以下代碼適用於短列表。 然而,對於較長的列表,性能會顯着降低:

import itertools
def closest(my_list, my_number):
    l=[]
    for i in range(1,len(my_list)+1):
        for k in itertools.combinations(my_list, i):
            l.append([k, sum(k)])
    l=[i for i in l if i[1]<=my_number]
    l.sort(key=lambda x:x[1])
    return l[-1]
print(closest(subset, 45)[0], closest(subset, 45)[1])

Output:

(25, 10, 9) 44

暫無
暫無

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

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