[英]Find the best approximation of a subset for a value
我想獲得一種算法,該算法可為我提供基於子集的值的最佳近似值。
這是一個例子:
N = 45
subset = [25,10,65,9,8]
output: [25,10,9]
重要的一點是算法必須給出最好的近似值(不管最終結果中元素的個數)。 結果必須提供給出最接近精確值的關聯(但不能超過初始值)。
您知道可以用最少的時間成本做到這一點的算法嗎?
非常感謝你的幫助。
找出是否存在總和恰好為 N 的子集顯然比找到總和最接近 N 的子集更容易,前一個問題稱為子集和,已知是 NP 完全問題。
然而,偽多項式時間是可能的。 事實上,如果我們將subset
中的值同時作為 weights 中的值以轉換為背包,則您的問題完全等於0/1 背包優化問題。 這個 0/1 背包問題有一個在O(nW)
中運行的動態規划解決方案,其中n
是subset
的項目數, 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.