各位高手, 小弟现在有一个算法需求,请各位大侠帮解,最好有运行起来的代码了,方便小弟学习,具体如下:
任意数组中m个数值,取m/n队组合,m%n也作为一组,求所有这样的组合;
例如:
有10个数,取3个为一组,列举出所有的3,3,3,1形式的组合。
string[] m_data = { "01", "02", "03", "04", "05", "06","07", "08", "09", "10" };
int n = 3;
最后要的结果是:
一组:{"01,02,03","04,05,06","07,08,09","10"};
二组:{"01,02,03","04,05,06","07,08,10","09"};
等等等等的所有组合。
------解决思路----------------------
给个比较烂的
static void Main(string[] args)
{
int n = 3;
var are = new List<string>() { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10" };
var result = Combinations(are, n).ToList();
foreach (var item in result)
{
var are1 = are.Except(item).ToList();
var result1 = Combinations(are1, n);
foreach (var item1 in result1)
{
var are2 = are1.Except(item1).ToList();
var result2 = Combinations(are2, n);
foreach (var item2 in result2)
{
Console.WriteLine("{0} {1} {2} {3}", string.Join(",", item), string.Join(",", item1), string.Join(",", item2), string.Join(",", are2.Except(item2).ToList()));
}
}
}
}
static IEnumerable<string[]> Combinations(List<string> are, int n)
{
var result = are.Select(x => new string[] { x });
for (int i = 0; i < n - 1; i++)
{
result = result.SelectMany(x => are.Where(y => y.CompareTo(x.First()) < 0).Select(y => new string[] { y }.Concat(x).ToArray()));
}
return result;
}
