查找最接近列表目标和的数字

时间:2019-03-30 22:33:47

标签: python itertools

我有一段代码,就像这样:

import itertools
numbers = [352.07, 15.20, 15.22, 2505.71, 2050.86, 
337.86, 833.90, 314.83]
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == 2842.77]
print(result)

从本质上讲,它使用itertool库获取数字列表,并尝试查找将哪些数字加起来求和(在本示例中为2842.77)。但是,在这种情况下,列表中的所有数字都不会实际加到目标数字上。

是否可以添加任何代码,以便在不存在完全匹配的情况下将CLOSEST编号设为目标编号?在此示例中,我正在寻找要吐出的控制台:

(2505.71,337.86),最接近的数字:2843.57

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用min()来获得总和与目标之间的绝对差最小的序列,例如使用key的{​​{1}}参数:

min()

答案 1 :(得分:1)

如果列表很小,则使用组合的解决方案就可以了,但是请注意,combinations(number, i)对所有i的总和为2**len(numbers)。它增长很快,并且会杀死您的程序。

您的问题称为“子集总和”,您想在其中选择一个数字子集以求和。它是众所周知的,并且具有许多变体和解决方案。它也是NP完全的,意味着没有真正的多项式(快速)解决方案。

但是,有一个使用动态规划的伪多项式解决方案。

此处的示例: https://www.geeksforgeeks.org/subset-sum-problem-dp-25/