找到接近X的数字组合

时间:2014-02-19 21:11:31

标签: recursion numbers combinations offset

想象一下,你有一个 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个数字的列表,但可能或多或少。

我的问题是解决此问题的最佳方式/算法(最快)是什么?我正在考虑一种递归方法,但还不确定如何。你对这个问题有什么看法?

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'数字的需求,但它是朝着正确方向迈出的一步,可以推广。

当然,根据问题的大小,“最快”的方式可能是划分可能的组合,将它们分配给一组机器,并让每个机器对其子集进行暴力计算。取决于如何表达问题。 :)