[英]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.