111,128
社区成员
发帖
与我相关
我的任务
分享 var a = new List<int>() {8, 11, 21, 24, 30, 46, 53, 73};
var r = new List<List<int>[]>();
foreach (var x in Combination(a, 3))
{
if (x.Sum() <= 100)
{
var b = a.Except(x).ToList();
foreach (var y in Combination(b, 3))
{
var z = b.Except(y).ToList();
if (y.Sum() <= 100 && z.Sum() <= 100) r.Add(new List<int>[] { x, y, z });
}
}
}
foreach (var x in r)
{
Console.WriteLine("[{0}] [{1}] [{2}]", string.Join(",", x[0]), string.Join(",", x[1]), string.Join(",", x[2]));
}
[24,30,46] [8,21,53] [11,73]
[24,30,46] [8,11,73] [21,53]
[24,30,46] [8,11,53] [21,73]
[21,30,46] [11,24,53] [8,73]
[21,30,46] [8,24,53] [11,73]
[21,30,46] [8,11,73] [24,53]
[21,30,46] [8,11,53] [24,73]
[21,24,53] [11,30,46] [8,73]
[21,24,53] [8,30,46] [11,73]
[21,24,53] [8,11,73] [30,46]
[21,24,46] [11,30,53] [8,73]
[21,24,46] [8,30,53] [11,73]
[21,24,46] [8,11,73] [30,53]
[21,24,30] [8,11,73] [46,53]
[11,30,53] [21,24,46] [8,73]
[11,30,53] [8,24,46] [21,73]
[11,30,53] [8,21,46] [24,73]
[11,30,46] [21,24,53] [8,73]
[11,30,46] [8,24,53] [21,73]
[11,30,46] [8,21,53] [24,73]
[11,24,53] [21,30,46] [8,73]
[11,24,53] [8,30,46] [21,73]
[11,24,46] [8,30,53] [21,73]
[11,21,53] [24,30,46] [8,73]
[11,21,53] [8,30,46] [24,73]
[11,21,46] [8,30,53] [24,73]
[8,30,53] [21,24,46] [11,73]
[8,30,53] [11,24,46] [21,73]
[8,30,53] [11,21,46] [24,73]
[8,30,46] [21,24,53] [11,73]
[8,30,46] [11,24,53] [21,73]
[8,30,46] [11,21,53] [24,73]
[8,24,53] [21,30,46] [11,73]
[8,24,53] [11,30,46] [21,73]
[8,24,46] [11,30,53] [21,73]
[8,21,53] [24,30,46] [11,73]
[8,21,53] [11,30,46] [24,73]
[8,21,46] [11,30,53] [24,73]
[8,11,73] [24,30,46] [21,53]
[8,11,73] [21,30,46] [24,53]
[8,11,73] [21,24,53] [30,46]
[8,11,73] [21,24,46] [30,53]
[8,11,73] [21,24,30] [46,53]
[8,11,53] [24,30,46] [21,73]
[8,11,53] [21,30,46] [24,73] var a = new List<int>() {8, 11, 21, 24, 30, 46, 53, 73};
var r = Combination(a, 3).Union(Combination(a, 2)).OrderByDescending(x => x.Sum());
foreach (var x in r)
{
if(x.Sum() <= 100) Console.WriteLine(string.Join(",", x));
}
24,30,46
46,53
21,24,53
21,30,46
24,73
11,30,53
21,73
8,11,73
21,24,46
8,30,53
11,24,53
11,30,46
11,21,53
8,24,53
8,30,46
11,73
30,53
8,21,53
11,24,46
8,73
11,21,46
8,24,46
24,53
30,46
21,24,30
8,21,46
21,53
8,11,53
24,46
21,46
11,24,30
8,11,46
11,53
11,21,30
8,24,30
8,53
8,21,30
11,46
11,21,24
24,30
8,46
8,21,24
21,30
8,11,30
21,24
8,11,24
11,30
8,11,21
8,30
11,24
11,21
8,24
8,21
8,11
求组合(C(m,n))的算法很多这里给一种 static IEnumerable<List<int>> Combination(List<int> src, int num)
{
int len = src.Count;
int i = 0;
for (i = 1; i < Math.Pow(2, len); i++)
{
var n = i;
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
if (n == num)
{
var s = Convert.ToString(i, 2).PadLeft(len, '0');
var r = new List<int>();
for (int j = 0; j < s.Length; j++)
{
if (s[j] == '1') r.Add(src[j]);
}
//Console.WriteLine("{0} {1}", s, string.Join(",", r));
yield return r;
}
}
}