2017-04-25 83 views
0

我如何检查可以从列表元素中创建一个数字?从列表元素中编号

例如: 名单= [1,1,3,3,3,3,5,10,23,53]

现在我们可以做9 [1,3,5]或[3,3,3] 我想类似的东西:

list=[1,1,3,3,3,3,5,10,23,53] 
tmp=[] 
sum=0 

for i in range(len(list)): 
    tmpChange=9 
    tmpChange -= list[i]+sum 
    if tmpChange == 0: 
     break 
    elif tmpChange > 0: 
     tmp.append(list[i]) 
     sum += list[i] 
     print(tmpChange) 
     print(tmp) 
    else: 
     tmp.pop(i) 
+1

,这是一个已知和明确定义的问题。 – DeepSpace

+1

除了您的主要问题之外,您正在将内容分配给像'list'和'sum'这样的内置函数。这不被推荐。尝试命名变量,如'my_list'或'my_sum'。 – blacksite

+0

确切地说,这是“背包问题”。对这个问题没有有效的解决方法是已知的,所以我建议你尝试所有的子集。尽管如此,它具有指数级的复杂性。 – Blaf

回答

3

接近这个是要找到所有的原始列表的子集,您可以使用itertools.combinations做的幼稚的方式。然后,您可以检查子集是否与您的原始值相加,然后将它们添加到set

import itertools 
l = [1,1,3,3,3,3,5,10,23,53] 
total = 9 
values = set() 
for r in range(1, len(l)): 
    for c in itertools.combinations(l, r): 
     if sum(c) == total: 
      values.add(tuple(c)) 

所以,结果是

>>> values 
{(1, 3, 5), (3, 3, 3)} 

由于使用下面的数据

l = [1,1,3,3,3,3,4,5,9,10,23,53] 

另一个例子的结果将是在线阅读的 “子集和”

>>> values 
{(4, 5), (3, 3, 3), (1, 1, 3, 4), (1, 3, 5), (9,)}