我有一段代码,就像这样:
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
谢谢!
答案 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/