求问一个c#算法问题 解惑的朋友我可以帮他下载两个csdn的东西,发qq微信都行。问题:一个二维int数组siwei[30][4],看做三十个成员,每个成员4个属性。其中随机十个成员为一组,求十个成员中每个属性的十个成员和,并且所有可能都列举出来。T_T来吧高手 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不就是分组算法吗?随机的话按guid排序后分页算法获取10个成员即可然后多少种组合这个应该说是算术题了吧,高中公式,可惜我忘了 既然是 所有可能都列举出来,那就不是什么随机了对 0~29 共30个数做 30 取 10 的组合,每个组合就是 siwei 第一维每组下标 高手,有代码验证下吗。要是没问题我帮你下载两个不限积分的csdn文件 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; } }扩展方法,自行验证 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; } 电脑验了下你的代码,一堆错我也不知道怎么办。额,是这样一个题目,我自己在游戏中自找的麻烦:有30艘飞船已知满属性(每个飞船有A.B.C.D四个属性),要求是----取出其中10艘飞船(看成一个组合),其中四维属性皆不低于某个数(设450吧),求其超过450的组合并显示出来,如果没有超过,求最接近450的组合(降低450的要求,449或448等等)。一看我就晕了,所以来求论坛的大神了。 == 看不懂没关系,能拿来用就可以了C#提供了那么多的方法,你不可能也不必要都去看懂他们实现的代码 var num = 6; var a = Enumerable.Range(0, num).ToList(); foreach(var k in a.Combination(3)) { Console.WriteLine(string.Join(",", k)); } label通过sender 取得父级panel 关于断点设置不了的问题,急 使用过Netron控件的请进! 如果想学 写外挂改从哪学起??? oracleDataAccess.dll 在windows 2008 R2出现错误。 C#中textBox1内容清空问题 简单的字符串和数字问题~~谢谢 求助网页上的数据写入数据库的方法 字符串截取问题一直没解决请大家帮忙看看 如何在asp.net中异步调用web service? 怎样将ListView的内容写入.txt文件 VS2015 C# 自定义"MyButton"类,为什么“MyButton”类里面的Image属性无法添加图片?
随机的话按guid排序后分页算法获取10个成员即可
然后多少种组合这个应该说是算术题了吧,高中公式,可惜我忘了
对 0~29 共30个数做 30 取 10 的组合,每个组合就是 siwei 第一维每组下标
{
/// <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;
}
}
扩展方法,自行验证
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;
}
C#提供了那么多的方法,你不可能也不必要都去看懂他们实现的代码
var num = 6;
var a = Enumerable.Range(0, num).ToList();
foreach(var k in a.Combination(3))
{
Console.WriteLine(string.Join(",", k));
}