在1、2、3、4、5、6、7、8中任意选出五个数分成两组,其中两组可以共用2个数字,使其和均为21,要求遍历所有可能的组合,请高手写个算法,兄弟我是黔驴技穷啊

解决方案 »

  1.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string[] array = { "1", "2", "3", "4", "5", "6", "7", "8" };
                //不知道其中两组可以共用2个数字,使其和均为21是什么意思,自行补充...的内容
                Combo(array, 5).Where(...).ToList().ForEach(x => Console.WriteLine(x));
            }        static IEnumerable<string> Combo(string[] array, int len)
            {
                int[] pos = new int[len];
                for (int i = 0; i < len; i++) pos[i] = i;
                while (pos[0] < array.GetLength(0) - len)
                {
                    string str = "";
                    for (int i = 0; i < len; i++) str += array[pos[i]] + " ";
                    for (int i = len - 1; i >= 0; i--)
                    {
                        if (pos[i] < array.GetLength(0) - len + i)
                        {
                            pos[i]++;
                            for (int j = i + 1; j <= len - 1; j++)
                            {
                                pos[j] = pos[i] + j - i;
                            }
                            break;
                        }
                        else
                        {
                            continue;
                        }
                    }
                    yield return str;
                }
            }
        }
    }
      

  2.   


     static void Main(string[] args)
            {
                List<int> numList = new List<int>(8);            for(int i = 1; i <= 8; i++)
                {
                    numList.Add(i);
                }            // 来那个层循环 取两个数所有可能性 两个数为m和n
                for(int m = 0; m < numList.Count; m++)
                {
                    for(int n = m + 1; n < numList.Count; n++)
                    {
                        int sum = 0;                    for(int i = 0; i < numList.Count; i++)
                        {
                            if(i != m && i != n)
                            {
                                sum += numList[i];
                            }
                        }                    int mNum = numList[m];
                        int nNum = numList[n];
                        int sub = 21 - mNum - nNum;                    if(sub * 2 == sum)
                        {
                            // 由这里可以看出 只有 1,5 2,4 两种可能
                            Console.WriteLine(string.Format("公共数字为{0}和{1};", numList[m], numList[n]));                        // 查找其他数据 还可以根据上面 用三层循环实现
                            List<int> tmpList = new List<int>(numList);
                            tmpList.Remove(mNum);
                            tmpList.Remove(nNum);                        int s = (int)Math.Pow(2, 6) / 2;                        for(int p = 0; p < s; p++)
                            {
                                List<int> result1 = new List<int>();
                                List<int> result2 = new List<int>();                            int[] flags = ConvertInt(6, p);                            for(int q = 0; q < 6; q++)
                                {
                                    if(flags[q] == 0)
                                    {
                                        result1.Add(tmpList[q]);
                                    }
                                    else if(flags[q] == 1)
                                    {
                                        result2.Add(tmpList[q]);
                                    }
                                    else
                                    {
                                        throw new Exception("数据处理出错");
                                    }
                                }                            if(Sum(result1) == sub)
                                {
                                    Print(result1);
                                    Print(result2);
                                    Console.WriteLine();
                                }
                            }
                        }
                    }
                }            Console.ReadLine();
            }        static int[] ConvertInt(int num, int i)
            {
                int[] flags = new int[num];            while(i != 0)
                {
                    flags[--num] = i % 2;
                    i = i / 2;
                }            return flags;
            }        static int Sum(List<int> items)
            {
                int sum = 0;            for(int i = 0; i < items.Count; i++)
                {
                    sum += items[i];
                }            return sum;
            }        static void Print(List<int> results)
            {
                string s = string.Empty;            for(int j = 0; j < results.Count; j++)
                {
                    if(results[j] != 0)
                    {
                        s += results[j] + ",";
                    }
                }            Console.WriteLine("{{{0}}}", s.Trim(','));
            }
      

  3.   

     for (int i = 1; i <= 8; i++)
                {
                    for (int d = 1; d <= 8; d++)
                    {
                        if ((36 + i + d) == 42)
                        {
                            if(i!=d)
                            {
                                MessageBox.Show(i.ToString() + "---" + d.ToString());
                            }
                        }
                    }
                }