簡體   English   中英

Python 最近子集和 function

[英]Python closest subset sum function

我正在編寫一個最接近的子集(s,A)function,它采用 integer s 和一個正整數數組 A 並返回一個由 A 的元素組成的數組,這些元素加起來為 s。 如果沒有與 s 相加的子集,我希望 function 改為返回與最接近 s 的值相加的子集。

例如:

如果 A 是 [12, 79, 99, 91, 81, 47] 並且 s 是 150,它將返回 [12, 91, 47] 因為 12+91+47 是 150

如果 A 是 [15, 79, 99, 6, 69, 82, 32] 並且 s 是 150 它將返回 [69, 82] 因為 69+82 是 151,並且沒有 A 的子集的和為 150。

# Driver code:
A = [15, 79, 99, 6, 69, 82, 32]
subset = closestSubset(5000,A)

如果存在正確的數字以形成 integer s,我了解如何生成此 function 但如果沒有,那么我該如何找到最接近的數字? 我是否必須實際創建一個左右范圍,例如,如果 integer 是 150,那么任何最接近 150 的數字(例如 10)都可以嗎?

代碼:

def closestSubset(s,A):
        return closestSubsetRec(s,A,len(A))
    
    def closestSubsetRec(s,A,i):
        #s is zero
        if s == 0:
            return []
        #no subset that adds up to s    
        if i == 0 and s!= 0:
            return   
        # else, check if sum can be obtained by any of the following 
        # (a) including the last element 
        # (b) excluding the last element    
        withIt = closestSubsetRec(s,A, i-1)  
        withoutIt = closestSubsetRec(s-A[i-1],A,i-1)
         # (b) excluding last element fails
        if withIt == None:
         # (a) including last element fails
            if withoutIt == None:            
                 # (a) including last element successes
                    return 
            else: 
                return append(withoutIt,A[i-1])
        return withIt

A =  [12, 79, 99, 91, 81, 47] 
B = [15, 79, 99, 6, 69, 82, 32]

print(closestSubset(150,A)) 
print(closestSubset(150,B))

這是使用itertools.combinations的簡單實現:

from itertools import combinations


def closest_subset(s, nums):
    return min((
        c
        for i in range(1, len(nums) + 1)
        for c in combinations(nums, i)
    ), key=lambda x: abs(s - sum(x)))


print(closest_subset(5000, [15, 79, 99, 6, 69, 82, 32]))

這個想法是返回子集,其sumx之間的min距離。

暫無
暫無

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

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