2011-01-06 36 views
0

如果我有几组数字(只是一个二维数组,其中每行是一个集):总结多套

[ 1, 3, -1, -1] 
[ 2, 4, -1, -1] 
[ 7, 8, 9, 10] 

会是什么的算法,创建款项的清单(忽略-1的)?对于上述结果将是:

1+2+7, 
1+2+8, 
1+2+9, 
1+2+10, 
1+4+7, 
1+4+8, 
1+4+9, 
1+4+10, 
3+2+7, 
3+2+8, 
3+2+9, 
3+2+10, 
3+4+7, 
3+4+8, 
3+4+9, 
3+4+10 
+4

从集合中删除{-1},取出新集合的Cartesian乘积,然后在结果中添加元素:http://en.wikipedia.org/wiki/Cartesian_product – 2011-01-06 21:10:56

回答

4

对于在第一列表中的每个号码,生成通过应用相同的方法,但所有的第一列表生成递归开始与该号码的所有款项和所有的款项。如果没有列表,那就是基本情况。

伪代码:

function find_sums(lists): 
    if lists is empty: 
     return [""] 
    sums = [] 
    for n in lists[0]: 
     if n != -1: 
      for sum in find_sums(lists from index 1 onwards): 
       sums.append(n + "+" + sum) 
    return sums 

这就是所谓的Cartesian product