有8个变量a1=50,a2=40,a3=30,a4=50,a5=50,a6=50,a7=50,a8=50,让每个变量从0到它的最大值开始循环,求a1+a2+a3+a4+a5+a6+a7+a8=116,所有这些组合的列表,怎样做啊,效率要高

解决方案 »

  1.   

    写 7个 for 循环吧.哈哈
      

  2.   

    void Test(params int[] iis){
      foreach(var item in iis){
        for(int i=0; i<item;i++)
        {}
      }
    }
      

  3.   

    用下面的算法吧,不过没几天是得不到所有的结果的            for (int a1 = 0; a1 <=50; ++a1)
                {
                    for (int a2 = 0; a2 <= 40; ++a2)
                    {
                        for (int a3 = 0; a3 <= Math.Min(30, 116 - a1 - a2); ++a3)
                        {
                            for (int a4 = 0; a4 <= Math.Min(50, 116 - a1 - a2 - a3); ++a4)
                            {
                                for (int a5 = 0; a5 <= Math.Min(50, 116 - a1 - a2 - a3 - a4); ++a5)
                                {
                                    int b5 = 116 - a1 - a2 - a3 - a4 - a5;
                                    for (int a6 = Math.Max(0, b5 - 50 -  50); a6 <= Math.Min(50, b5); ++a6)
                                    {
                                        int b6 = 116 - a1 - a2 - a3 - a4 - a5 - a6;
                                        for (int a7 = Math.Max(0, b6 - 50); a7 <= Math.Min(50, b6); ++a7)
                                        {
                                            int a8 = 116 - a1 - a2 - a3 - a4 - a5 - a6 - a7;
                                            Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}", a1, a2, a3, a4, a5, a6, a7, a8);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
      

  4.   

    a1=50,a2=40,a3=30,a4=50,a5=50, 有 925810 种组合:D还没加a6, a7, a8....晕倒。。
      

  5.   

    换种思考方式:  也就是:    116 分给  8变量!  
     int a1 = 50, a2 = 40, a3 = 30, a4 = 50, a5 = 50, a6 = 50, a7 = 50, a8 = 50;            //for (int i = ; i++)
                //{ 
                //   for()
                //}
                for (int i = 0; i <= 116; i++)
                {
                    if (i <= 50)
                        a1 = i;
                    else
                        a1 = 50;
                    for (int j = 0; j <= 116 - i; j++)
                    {
                        if (j <= 40)
                            a2 = j;
                        else
                            a2 = 40;
                        for (int k = 0; k <= 116 - i - j; k++)
                        {
                            if (k <= 30)
                                a3 = k;
                            else
                                a3 = 30;
                            for (int l = 0; l <= 116 - i - j - k; l++)
                            {
                                if (l <= 50)
                                    a4 = l;
                                else
                                    a4 = 50;
                                for (int m = 0; m <= 116 - i - j - k -l; m++)
                                {
                                    if (m <= 50)
                                        a5 = m;
                                    else
                                        a5 = 50;                                for (int n = 0; n <= 116 - i - j - k - l - m; n++)
                                    {
                                        if (n <= 50)
                                            a6 = n;
                                        else
                                            a6 = 50;
                                        for (int o = 0; o <= 116 - i - j - k - l - m - n;o++ )
                                        {
                                            if (o <= 50)
                                                a7 = o;
                                            else
                                                a7 = 50;
                                            for (int p= 0;p<116 - i - j - k - l - m - n-o ;p++ )
                                            {
                                                if (p <= 50)
                                                    a8 = p;
                                                else
                                                    a8 = 50;                                           
                                            }
                                            Console.WriteLine("{0}   {1}   {2}   {3}   {4}  {5}   {6}   {7}", a1, a2, a3, a4, a5, a6, a7, a8);
                                                     }
                                    }
                                }                        }
                        }                }
                    
                    
                }Console.ReadKey();
      

  6.   

    int ms1 = 40 + 30 + 50 + 50 + 50 + 50 + 50;
    int ms2 = 30 + 50 + 50 + 50 + 50 + 50;
    int ms3 = 50 + 50 + 50 + 50 + 50;
    int ms4 = 50 + 50 + 50 + 50;
    int ms5 = 50 + 50 + 50;
    int ms6 = 50 + 50;
    int ms7 = 50;
    long n = 0;
    for (int a1 = Math.Max(0, 116 - 0 - ms1), s1 = 0 + a1; a1 <= 50 && s1 <= 116; a1++, s1++)
        for (int a2 = Math.Max(0, 116 - s1 - ms2), s2 = s1 + a2; a2 <= 40 && s2 <= 116; a2++, s2++)
            for (int a3 = Math.Max(0, 116 - s2 - ms3), s3 = s2 + a3; a3 <= 30 && s3 <= 116; a3++, s3++)
                for (int a4 = Math.Max(0, 116 - s3 - ms4), s4 = s3 + a4; a4 <= 50 && s4 <= 116; a4++, s4++)
                    for (int a5 = Math.Max(0, 116 - s4 - ms5), s5 = s4 + a5; a5 <= 50 && s5 <= 116; a5++, s5++)
                        for (int a6 = Math.Max(0, 116 - s5 - ms6), s6 = s5 + a6; a6 <= 50 && s6 <= 116; a6++, s6++)
                            for (int a7 = Math.Max(0, 116 - s6 - ms7), s7 = s6 + a7; a7 <= 50 && s7 <= 116; a7++, s7++)
                                Console.WriteLine("{0}: {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}", ++n, a1, a2, a3, a4, a5, a6, a7, 116 - s7);