2013-03-14 84 views
0

所以,您將得到10個號碼和你都應該選擇5個號碼出那些使得總量爲100總和5號= 100

現在,我顯然試圖用一個程序來解決它,用五個循環得到了明顯的解決方案。但我只想知道是否有任何有效的方法來做到這一點?

這裏是先生很明顯的:

 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(); 
     } 
+18

你忘了'python'標籤.. – 2013-03-14 13:26:04

+1

你爲什麼把幾種不同的語言作爲標籤?你想要什麼答案? – Arran 2013-03-14 13:26:05

+4

看起來像一個動態編程工作。也許是揹包問題的一個變種? – 2013-03-14 13:26:26

回答

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(); 
    } 
    
+0

希望編譯器可以進行優化2)和3),並且只有1)需要任何新代碼。 – 2013-03-14 13:35:46

+0

@Marc Glisse:編譯器可能[我不會指望它]進行優化3)[如果它足夠聰明,可以檢測到它永遠不會改變]。我敢打賭,編輯器不會檢測到總和「a [f] + a [s] + a [t] + a [fr] + a [ft]」的部分可以移動到外部循環。正如你所認同的那樣,1)優化將最大限度地提高速度,這將需要人爲改變代碼。 – MrSmith42 2013-03-14 13:46:24