比方说,我有一个整数列表/阵列,即:列表项计算
{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}
比方说,我有一个整数列表/阵列,即:列表项计算
{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}
在此基础上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();
PS:(*)找不到单词英文单词群只有一个元素
有了更具体的诠释列表,你可以做到这一点
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)
编辑:正如皮埃尔正确地指出,该代码没有坚持的问题,因此我修正,添加或不号码结果列表中添加的参数。
测试值'{1,2,3,4}'没有给出预期的结果,发送'新列表
我用'{1,2,3,4}'再次运行它,输出为'1,2,3,4,5,6,7,8,9,10',但是出了什么问题?我知道在构造函数中发送新的List似乎有些奇怪,这里只是使用该函数的更快方式,您可以在调用GetCombination并将其作为参数传递之前初始化列表,但对于重复性调用,您需要将它作为参数。当然可以做任何改进。 – Leze
来自op问题:“所以最终结果将是(没有重复): '{3,4,5,6,7,8,9,10}'”Op正在插入“singleton”子集'{{ 1},{2},{3},{4}}'。 –
是的,有..所以你有什么尝试? – BugFinder
看看[问]和[mcve]。 – PJvG
在您的示例中,您以结构化的方式编写了计算。这个结构是你找到一个算法来做这个计算的起点。 –