5个数字的总和= 100

时间:2013-03-14 13:24:01

标签: algorithm language-agnostic logic

所以,你得到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();
        }

2 个答案:

答案 0 :(得分:0)

这里有一些优化想法:

  • 如果所有数字都是正数,则可以跳过内部循环,总和已经> = 100
  • 您可以通过计算每个循环中的部分总和来减少计算(外部循环的值在运行内部循环时不会改变)。
  • 只计算一次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 数字索引可供选择。

这应该减少迭代次数。