2011-01-06 48 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