[英]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]))
这个想法是返回子集,其sum
与x
之间的min
距离。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.