算法思想:
集合中的某个元素,要么在子集中,要么不在子集中;
每次从集合中取一个元素,将该元素放在子集中,如果子集中的元素个数等于M,
则输出集合中的元素,否则继续取舍;将该元素从子集中删除,继续取舍直到集合尾部;
C#实现:
/// <summary>
/// 求集合中的M个元素构成的子集
/// </summary>
/// <param name="a">集合</param>
/// <param name="i">已对集合中的第i-1个元素取舍</param>
/// <param name="m">子集元素的个数</param>
/// <param name="n">集合元素的个数</param>
/// <param name="b">临时集合,用来输出子集</param>
void PowerSetMFromN(int[] a, int i, int m, int n, List<int> b)
{
if (i <= n)
{
int x = a[i - 1];
b.Add(x); //取
if (b.Count == m) //元素个数等于子集中要求的个数,输出
{
Console.Write(" { ");
for (int j = 0; j < b.Count; j++)
{
if (j < (b.Count - 1))
Console.Write(b[j] + " , ");
else
Console.Write(b[j] + " } ");
}
Console.WriteLine();
}
else
{
PowerSetMFromN(a, i + 1, m, n, b);
}
b.Remove(x); //舍
PowerSetMFromN(a, i + 1, m, n, b);
}
}