查找加起来为数字X的正数列表中的所有元素

时间:2013-02-04 17:31:04

标签: python

我正在尝试对遗留报告进行逆向工程并使用python来解决问题。

旧版报告的结束总数为200,000。

我知道可以结束这个200k的数字集合,但是这个集合中充斥着许多其他要过滤掉的数字(逻辑我还没理解)。

在python中,我如何遍历数字列表以查找可变长度的所有条目(子列表)(可能是1个元素= 200k,或15个元素的乘积......)到200k?

我开始写出来,然后当我意识到元素#1 + 2可能溢出但是列表元素#1 + 4 + 7可能与200k匹配时决定寻求帮助....

这几乎就像是因子化,但不是产品的总和,而是在可能的候选者列表中。

不确定。有任何想法吗?有没有做过这样的事情?

其他详细信息:
随着排列和numpy我得到了预期的结果,但是预期的输入和输出需要太长时间。 (即天......?)

以下是我所在的地方:

下面似乎给出了正确的结果,虽然看起来需要一段时间。

我会接受上面的答案,让它过夜。

谢谢,

from itertools import permutations 
import numpy , pickle, random
output_results = {} 
input_array = [random.randrange(0,15000) for i in range(1000)]
desired_sum = 200000
#input_array = (1,2,9,13,12) 
#desired_sum = 23 

for r in range(1,len(input_array)): 
    for p in permutations(input_array, r):
        temp_sum = numpy.sum(p) 
        if temp_sum == desired_sum: 
            output_results[p] = numpy.sum(p) 
    if r % 10 == 0:
        print "Finished up to number %s " % r 

pickle.dump( output_results, open( "save.p", "wb" ) )

1 个答案:

答案 0 :(得分:1)

Itertools.permutations可以提供帮助。

r中改变permutations(iterable, r)的值,您可以尝试查找包含来自r(您的收藏集)的iterable条目的所有可能排列,您可以轻松地在其中得到总和(例如用numpy.sum)。

如果您对预期结果有所了解并为r设定合理的上限,您应该在合理的时间内得到答案

修改

@joefromct:您可以先估算出以下列方式找到所需解决方案所需的r的最大值(未经过测试,但想法应该是正确的)

sorted_input = np.sorted(input_array)
cumsum = np.cumsum(sorted_input)
max_r = (cumsum<desired_sum).sum()
if max_r == len(input_array) and sorted_input[-1] < desired_sum:
    print("sorry I can't do anything for you")
    exit()

for r in range(1,max_r):
    [...]