2017-04-05 173 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}}'。 –