Recursion 查找接近X的数字组合

Recursion 查找接近X的数字组合,recursion,numbers,combinations,offset,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) 输出: 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],因

假设你有一个N个数字的列表。你也有“目标”号码。您希望找到求和在一起的Z数的组合接近目标值

示例:

Target = 3.085

List = [0.87, 1.24, 2.17, 1.89]
[0.87, 2.17] = 3.04 (0.045 offset)
输出:

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。这是一个由两个数字组成的列表,但它可能或多或少


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

直觉上,我会先对列表进行排序。(使用您喜欢的算法。)然后找到小于目标的最大元素的索引。从中选择小于目标的最大元素,并将其与最小元素组合。这可能就是你的基线偏移量。如果它是一个负偏移量,你可以继续寻找使用更大数字的组合;如果是正偏移量,则可以使用较小的数字继续查找组合。在这一点上,递归可能是合适的

当然,这还不能解决“Z”数字的需要,但这是朝着正确方向迈出的一步,可以推广

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

这是一个问题。要解决此问题,请执行以下操作:

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
def knap(数字、目标):
值=集合()
值。添加(0)
对于v值:
对于n个数字:

如果v+nBest是最简单的还是最快的,或者…?我在寻找最快的方法有没有特别的原因[0.87,2.17]不是最接近的?因为它低于目标?哦,对不起!这是个错误!应该是[0.87,2.17]。。。。