想象一下,你有一个 N 号码列表。您还有“目标”号码。你想找到总和在一起的Z数的组合接近目标。
示例:
Target = 3.085
List = [0.87, 1.24, 2.17, 1.89]
输出:
[0.87, 2.17] = 3.04 (0.045 offset)
在上面的示例中,您将得到组[0.87,2.17],因为它与目标的偏移量最小为0.045。它是2个数字的列表,但可能或多或少。
我的问题是解决此问题的最佳方式/算法(最快)是什么?我正在考虑一种递归方法,但还不确定如何。你对这个问题有什么看法?
答案 0 :(得分:1)
这是knapsack problem。要解决它,您将执行以下操作:
def knap(numbers,target):
values = Set()
values.add(0)
for v in values:
for n in numbers:
if v+n<(2*target): # this is optional..
values.add(v+n);
for v in values:
# find the closest item to your target
基本上,您正在构建所有可能的数字总和。如果您有整数值,则可以使用数组而不是集合来更快地实现这一点。
答案 1 :(得分:0)
直观地说,我会从排序列表开始。 (使用您最喜欢的算法。)然后找到小于目标的最大元素的索引。从那里,选择小于目标的最大元素,并将其与最小元素组合。这可能是你的基线偏移量。如果是负偏移,您可以继续使用更大的数字来寻找组合;如果是正偏移量,您可以继续使用较小的数字来寻找组合。此时递归可能是合适的。
当然,这还没有满足对'Z'数字的需求,但它是朝着正确方向迈出的一步,可以推广。
当然,根据问题的大小,“最快”的方式可能是划分可能的组合,将它们分配给一组机器,并让每个机器对其子集进行暴力计算。取决于如何表达问题。 :)