解惑的朋友我可以帮他下载两个csdn的东西,发qq微信都行。
问题:一个二维int数组siwei[30][4],看做三十个成员,每个成员4个属性。其中随机十个成员为一组,求十个成员中每个属性的十个成员和,并且所有可能都列举出来。T_T来吧高手

解决方案 »

  1.   

    不就是分组算法吗?
    随机的话按guid排序后分页算法获取10个成员即可
    然后多少种组合这个应该说是算术题了吧,高中公式,可惜我忘了
      

  2.   

    既然是 所有可能都列举出来,那就不是什么随机了
    对 0~29 共30个数做 30 取 10 的组合,每个组合就是 siwei 第一维每组下标
      

  3.   

    高手,有代码验证下吗。要是没问题我帮你下载两个不限积分的csdn文件
      

  4.   

        static class Extend
        {
            /// <summary>
            /// 笛卡尔积
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="sequences"></param>
            /// <returns></returns>
            public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(
            this IEnumerable<IEnumerable<T>> sequences)
            {
                IEnumerable<IEnumerable<T>> emptyProduct = new[] { Enumerable.Empty<T>() };
                return sequences.Aggregate(
                  emptyProduct,
                  (accumulator, sequence) =>
                    from accseq in accumulator
                    from item in sequence
                    select accseq.Concat(new[] { item }));
            }
            /// <summary>
            /// 组合
            /// </summary>
            /// <typeparam name="TValue"></typeparam>
            /// <param name="values"></param>
            /// <param name="num"></param>
            /// <returns></returns>
            public static IEnumerable<IEnumerable<TValue>> Combination<TValue>(
                this IEnumerable<TValue> values,
                //            Int32 count,
                Int32 num)
            {
                var t = Enumerable.Range(0, num).ToList();
                do
                {
                    yield return values.Where((x, i) => t.Contains(i));
                }
                while (NextCombination(t, values.Count(), num));
            }
            /// <summary>
            /// C(n,m) 的下一项
            /// </summary>
            /// <param name="ar"></param>
            /// <param name="num"></param>
            /// <param name="k"></param>
            /// <returns></returns>
            public static bool NextCombination(List<int> ar, int n, int m)
            {
                if (ar.Count() != m) ar = Enumerable.Range(0, m).ToList();
                bool changed = false, finished = false;
                if (m > 0)
                {
                    for (int i = m - 1; !changed && !finished; i--)
                    {
                        if (ar[i] < (n - 1) - (m - 1) + i)
                        {
                            ar[i]++;
                            if (i < m - 1)
                            {
                                for (int j = i + 1; j < m; j++)
                                {
                                    ar[j] = ar[j - 1] + 1;
                                }
                            }
                            changed = true;
                        }
                        finished = (i == 0);
                    }
                }
                return changed;
            }
        }
    扩展方法,自行验证
      

  5.   

                int[,] siwei = new int[30, 4];
                string[] strArr = Group(30, 3);
                for (int i = 0; i < strArr.Length; i++)
                {
                    for (int j = 0; j < 4; j++)
                    {
                        List<int> numberList = strArr[i].Split(' ').Select(int.Parse).ToList();
                        int count = numberList.Sum(t => siwei[t, j]);
                        Console.WriteLine($"第{i + 1}组第{j + 1}个属性的十个成员和为{count}");
                    }
                    Console.WriteLine();
                }
                Console.ReadKey();
            static string[] Group(int number, int groups)
            {
                List<int> list = new List<int>();
                int num = number / 3;
                string[] strArr = new string[groups];
                for (int i = 0; i < number; i++)
                    list.Add(i);
                for (int i = 0; i < groups; i++)
                {
                    for (int j = 0; j < num; j++)
                    {
                        int value = list[new Random(Guid.NewGuid().GetHashCode()).Next(0, list.Count)];
                        list.Remove(value);
                        strArr[i] += value.ToString("D2") + " ";
                    }
                    strArr[i] = strArr[i].Substring(0, strArr[i].Length - 1);
                }
                return strArr;
            }
      

  6.   

    电脑验了下你的代码,一堆错我也不知道怎么办。额,是这样一个题目,我自己在游戏中自找的麻烦:有30艘飞船已知满属性(每个飞船有A.B.C.D四个属性),要求是----取出其中10艘飞船(看成一个组合),其中四维属性皆不低于某个数(设450吧),求其超过450的组合并显示出来,如果没有超过,求最接近450的组合(降低450的要求,449或448等等)。一看我就晕了,所以来求论坛的大神了。 ==
      

  7.   

    看不懂没关系,能拿来用就可以了
    C#提供了那么多的方法,你不可能也不必要都去看懂他们实现的代码
                var num = 6;
                var a = Enumerable.Range(0, num).ToList();
                foreach(var k in a.Combination(3))
                {
                    Console.WriteLine(string.Join(",", k));
                }