所以,你得到10个数字,你应该选择5个数字,这样总和就是100个。
现在,我显然试图使用一个程序解决它,并获得了五个循环的明显解决方案。但我只是想知道有没有有效的方法来做到这一点?
这是Obvious先生:
static void Main(string[] args)
{
int[] a = { 2, 6, 10, 14, 18, 22, 26, 30, 34, 38 };
for (int f = 0; f < a.Length - 4; f++)
{
for (int s = f+1; s < a.Length - 3; s++)
{
for (int t = s+1; t < a.Length - 2; t++)
{
for (int fr = t + 1; fr < a.Length - 1; fr++)
{
for (int ft = fr + 1; ft < a.Length; ft++)
{
int sum = a[f] + a[s] + a[t] + a[fr] + a[ft];
Console.WriteLine(sum);
if (sum == 100)
{
Console.WriteLine("---------------------------------------");
Console.WriteLine(a[f]);
Console.WriteLine(a[s]);
Console.WriteLine(a[t]);
Console.WriteLine(a[fr]);
Console.WriteLine(a[ft]);
Console.WriteLine("---------------------------------------");
}
}
}
}
}
}
Console.ReadLine();
}
答案 0 :(得分:0)
这里有一些优化想法:
只计算一次a.Length
并存储它,因为此值永远不会改变
static void Main(string[] args)
{
int[] a = { 2, 6, 10, 14, 18, 22, 26, 30, 34, 38 };
int lenA=a.Length;
int alenMinus4=lenA-4,
int alenMinus3=lenA-3,
int alenMinus2=lenA-2,
int alenMinus1=lenA-1,
for (int f = 0; f < alenMinus4; f++)
{ int sum1=a[f];
if(sum1>100)
{ f=alenMinus4;
}
else
{ for (int s = f+1; s < alenMinus3; s++)
{ int sum2=sum1+ a[s];
if(sum2>100)
{ s=alenMinus3;
}
else
{ for (int t = s+1; t < alenMinus2; t++)
{ int sum3=sum2+ a[t];
if(sum3>100)
{ t=alenMinus2;
}
else
{ for (int fr = t + 1; fr < alenMinus1; fr++)
{ int sum4=sum3+ a[fr];
if(sum4>100)
{ fr=alenMinus1;
}
else
{ for (int ft = fr + 1; ft < lenA; ft++)
{ int sum = sum4 + a[ft];
Console.WriteLine(sum);
if (sum == 100)
{ Console.WriteLine("---------------------------------------");
Console.WriteLine(a[f]);
Console.WriteLine(a[s]);
Console.WriteLine(a[t]);
Console.WriteLine(a[fr]);
Console.WriteLine(a[ft]);
Console.WriteLine("---------------------------------------");
} } } } } } } } } }
Console.ReadLine();
}
答案 1 :(得分:0)
您可以使用组合。看看这个问题: creating all possible k combinations of n items in C++
在这种情况下,你有n个数字和k 数字索引可供选择。
这应该减少迭代次数。