我有一个数字列表
[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
(我不确定这是否是此示例中实际最接近的组合,只显示它应如何工作)
答案 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