数组中多元素的和最接近于一个固定值,返回各元素的位置查找到的元素
主要场景:在数组中找到多个元素的和最接近于一个给定值,且这些元素不一定是连续的
回溯法:通过递归进行尝试和回退,逐步构建可能的元素组合,并在发现一个组合的和接近目标值时记录。
from itertools import combinations
def find_closest_sum(arr, target):
n = len(arr)
closest_sum = float('inf') #初始化为一个正无穷极大值
closest_combination = None # 最接近的组合的元素列表
closest_indices = None # 最接近组合的索引列表
# 遍历所有可能的组合(包括组合长度为1到n的情况)
for r in range(1, n + 1):
for comb in combinations(range(n), r):
current_sum = sum(arr[i] for i in comb)
# 如果当前和比之前的结果更接近目标值
if abs(current_sum - target) < abs(closest_sum - target):
closest_sum = current_sum
closest_combination = [arr[i] for i in comb]
closest_indices = list(comb)
return closest_indices, closest_sum, closest_combination # 返回索引、和以及组合的元素
# 示例用法
arr = [5.2, 2.11, 3.44, 100, 4.89]
target = 11.34
indexArr, closest_sum, closest_combination = find_closest_sum(arr, target)
print(f"最接近 {target} 的组合索引为: {indexArr}, 其元素为: {closest_combination}, 其和为: {closest_sum}")
from itertools import combinations
def find_closest_sum(arr, num):
res = []
_min = sum(arr)
for i in range(2, len(arr) + 1):
_iter = combinations(arr, i)
for lt in _iter:
if abs(sum(lt) - num) < _min:
_min = abs(sum(lt) - num)
res = lt
return res
# 测试用例
arr = [5.2, 2.11, 3.44, 100, 4.89]
target = 11.34
indexArr= find_closest_sum(arr, num)
print(indices)