使用数字列表计算与X的最接近的总和

时间:2014-11-05 16:13:36

标签: python algorithm numbers

我有一个数字列表

[850, 1300, 810, 590, 590, 910, 480, 1170, 430, 530, 295, 970, 560, 410, 570, 680, 180, 180, 400, 1040]

我想给函数一个整数参数,让它通过对列表中的数字求和来返回最接近的数字,并告诉我它用来实现这个数字。

例如,我给它编号为3255,它会吐出像

这样的东西
1300, 810, & 1170 sum to 3280

(我不确定这是否是此示例中实际最接近的组合,只显示它应如何工作)

2 个答案:

答案 0 :(得分:1)

如果您只是想强制解决问题,请使用itertools中修改过的powerset配方:

import itertools as it

def powerset(iterable):
    "powerset([1,2,3]) --> (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return it.chain.from_iterable(it.combinations(s, r) for r in range(1, len(s)+1))

def f(n, lst):
    return min((abs(n-sum(i)), i) for i in powerset(lst))[1]

这种方法对于比示例列表大得多的初始列表不起作用,因为powersets以指数方式增长。

答案 1 :(得分:0)

以下是比蛮力

更复杂的伪代码

假设输入数组是arr [],则存在用于存储输出的堆栈

recurse(n, index)
{
    int temp = n; int ind = index;
    while(ind<arr.length)
        if(arr[ind]>n)
            ind++;
        else
            temp = temp - arr[ind];
            stack.push(temp);
            if(temp==0)
                return true;
            result = recurse(temp,ind+1);
            if(result is false)
                temp = n; stack.pop();
                ind++;
            else
                break;
    if(ind==arr.length) then return false
}
print stack

实施例: 如果数组如下 11 9 8 7 5 你需要找到26 然后执行如下

递归(26,0) 26-11 - &gt;自26-11 = 15后递归(15,1);将11推入堆栈 递归(15,1) 15-9 - &gt;递归(6,2)自15-9 = 6;在堆栈中推送9 递归(6,2) 6-5 - &gt;递归(1,4)推进堆叠5 recurse(1,4)返回false,因为没有小于1的元素从堆栈弹出5 因为除了5之外没有小于6的元素,所以从堆栈中弹出9 现在它计算15-8 = 7递归(7,3),在堆栈中推8 recurse(7,3)在堆栈中按7返回true

最后它打印堆栈11,8,7,其中11 + 8 + 7 = 26