繁体   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