【发布时间】:2015-09-15 16:05:37
【问题描述】:
我正在寻找有关查找数组子集的帮助。
int[] array = { 1,2,3,5,8,10,15,23};
我必须找到一个数组的所有子集。如果子集元素的总和等于数组中的任何数字,那么我的计数器就会增加。例如:1+2=3、2+3=5、5+8+10=23、1+2+5=8、2+3+8+10=23
public static void Main(string[] args)
{
int[] array = { 1, 2, 3, 5, 8, 10, 15, 23 };
int arrayLength = array.Count();
int sum = 0;
int subsetCount = 0;
for (int i = 0; i < arrayLength; i++)
{
for (int j = i + 1; j < arrayLength; j++)
{
sum = array[i] + array[j];
for (int m = j + 1; m < arrayLength; m++)
{
for (int k = 0; k < arrayLength; k++)
{
if (array[k] == sum)
{
subsetCount++;
}
}
sum = array[i] + array[j] + array[m];
}
}
}
Console.WriteLine(subsetCount);
Console.ReadLine();
}
我可以接受 2 元素和 3 元素的子集。但是4及以上我不知道怎么解决?
任何帮助将不胜感激
【问题讨论】:
-
我建议做的一件事是编写一个方法来检查子集元素的总和是否等于数组中的任何数字。所以得到一个总和,然后将其传递给该方法,让该方法返回 true 或 false,如果为 true,则增加您的计数器。
-
我认为部分答案可以很好地复制 - How to get all subsets of an array,但这可能太难从那个跳到完整答案...
-
致 OP:请注意,如果您正在处理真正的子集(即不是您的答案所关注的连续子集),评论者 @AlexeiLevenkov 引用的问题包括描述高效、位数组的答案- 寻找子集的解决方案。从内存占用的角度来看,这些方法比我描述的递归方法更好,但随着初始数组长度的增加,它们也会有类似的时间限制。如果合适,这两种解决方案都值得熟悉。如果这解决了您的问题,请考虑将此问题作为该问题的副本结束。