2017-04-05 178 views
0

比方說,我有一個整數列表/陣列,即:列表項計算

{1, 2, 3, 4} 

是否有一種方式來獲得增加的每一個可能的組合,並將它們添加到另一個列表/陣列?

像這樣:

1+2, 1+3, 1+4, 
2+3, 2+4, 
3+4, 

1+2+3, 1+2+4, 1+3+4, 
2+3+4, 

1+2+3+4 

所以,最終的結果將是(不重複):

{3, 4, 5, 6, 7, 8, 9, 10} 
+11

是的,有..所以你有什麼嘗試? – BugFinder

+1

看看[問]和[mcve]。 – PJvG

+2

在您的示例中,您以結構化的方式編寫了計算。這個結構是你找到一個算法來做這個計算的起點。 –

回答

0

在此基礎上great answer這裏是一個版本,讓你消除「小子集「(*)

public static List<List<T>> GetCombination<T>(List<T> inputList, int minimumItems = 1) 
{ 
    int count = (int)Math.Pow(2, inputList.Count) - 1; 
    List<List<T>> result = new List<List<T>>(count + 1); 

    if (minimumItems == 0) 
     result.Add(new List<T>()); 

    for (int i = 1; i <= count; i++) 
    { 
     List<T> combinason = new List<T>(inputList.Count); 
     for (int j = 0; j < inputList.Count; j++) 
     { 
      if ((i >> j & 1) == 1) 
       combinason.Add(inputList[j]); 
     } 

     if (combinason.Count >= minimumItems) 
      result.Add(combinason); 
    } 

    return result; 
} 

結果:

>> { {1,2}, {1,3}, {2,3}, {1,2,3}, {1,4}, {2,4}, 
>> {1,2,4}, {3,4}, {1,3,4}, {2,3,4}, {1,2,3,4} } 

從該子集在這裏簡單.Sum()

Subsets.ForEach(s => result.Add(s.Sum())); 

當你想清除列表中的每個副本:

DoublonList.Distinct(); 

C# fiddle

PS:(*)找不到單詞英文單詞羣只有一個元素

2

有了更具體的詮釋列表,你可以做到這一點

static List<int> GetCombination(List<int> list, List<int> combinations, int sumNum, bool addNumberToResult = false) 
    { 
     if (list.Count == 0) { 
      return combinations; 
     } 

     int tmp; 

     for (int i = 0; i <= list.Count - 1; i++) { 
      tmp = sumNum + list[i]; 
      if(addNumberToResult){ 
       combinations.Add(tmp); 
      } 
      List<int> tmp_list = new List<int>(list); 
      tmp_list.RemoveAt(i); 
      GetCombination(tmp_list,combinations,tmp, true); 
     } 

     return combinations; 
    } 

,並把它簡單地做

List<int> numbers = new List<int>(){1,2,3,4,5}; 
List<int> possibleCombination = GetCombination(numbers, new List<int>(), 0); 

,並刪除重複的

possibleCombination.Distinct() 

如果你想它訂貨人可以致電

possibleCombination.Distinct().OrderBy(itm => itm) 

possibleCombination.Distinct().OrderByDescending(itm => itm) 

C# fiddle

編輯:正如皮埃爾正確地指出,該代碼沒有堅持的問題,因此我修正,添加或不號碼結果列表中添加的參數。

+0

測試值'{1,2,3,4}'沒有給出預期的結果,發送'新列表(),0'到一個函數有點奇怪。 –

+0

我用'{1,2,3,4}'再次運行它,輸出爲'1,2,3,4,5,6,7,8,9,10',但是出了什麼問題?我知道在構造函數中發送新的List似乎有些奇怪,這裏只是使用該函數的更快方式,您可以在調用GetCombination並將其作爲參數傳遞之前初始化列表,但對於重複性調用,您需要將它作爲參數。當然可以做任何改進。 – Leze

+0

來自op問題:「所以最終結果將是(沒有重複): '{3,4,5,6,7,8,9,10}'」Op正在插入「singleton」子集'{{ 1},{2},{3},{4}}'。 –