求集合所有子集问题
2012-10-25 10:20
232 查看
算法思想:集合中的某个元素,要么在子集中,要么不在子集中;
每次从集合中取一个元素,将该元素放在子集中,继续取元素直到集合尾部;
将该元素从子集中删除,继续取元素知道集合尾部;
在到达集合尾部时,输出子集中的元素。
C#实现:
/// <summary>
/// 求集合的所有子集
/// </summary>
/// <param name="a">集合</param>
/// <param name="i">已对集合中的第i-1个元素取舍</param>
/// <param name="n">集合元素的个数</param>
/// <param name="b">临时集合,用来输出子集</param>
void PowerSet(int[] a,int i,int n,List<int> b)
{
if(i>n) //到达集合尾部输出子集元素
{
Console.Write(" { ");
for (int j = 0; j < b.Count;j++ )
{
if(j < (b.Count - 1))
Console.Write(b[j] + " , ");
else
Console.Write(b[j] + " } ");
}
if(b.Count==0)
{
Console.Write(" } ");
}
Console.WriteLine();
}
else
{
int x = a[i-1];
b.Add(x); //取
PowerSet(a, i + 1, n, b);
b.Remove(x); //舍
PowerSet(a, i + 1, n, b);
}
}
每次从集合中取一个元素,将该元素放在子集中,继续取元素直到集合尾部;
将该元素从子集中删除,继续取元素知道集合尾部;
在到达集合尾部时,输出子集中的元素。
C#实现:
/// <summary>
/// 求集合的所有子集
/// </summary>
/// <param name="a">集合</param>
/// <param name="i">已对集合中的第i-1个元素取舍</param>
/// <param name="n">集合元素的个数</param>
/// <param name="b">临时集合,用来输出子集</param>
void PowerSet(int[] a,int i,int n,List<int> b)
{
if(i>n) //到达集合尾部输出子集元素
{
Console.Write(" { ");
for (int j = 0; j < b.Count;j++ )
{
if(j < (b.Count - 1))
Console.Write(b[j] + " , ");
else
Console.Write(b[j] + " } ");
}
if(b.Count==0)
{
Console.Write(" } ");
}
Console.WriteLine();
}
else
{
int x = a[i-1];
b.Add(x); //取
PowerSet(a, i + 1, n, b);
b.Remove(x); //舍
PowerSet(a, i + 1, n, b);
}
}
相关文章推荐
- 求一个集合的所有子集问题
- [数字技巧]子集问题(寻找给定集合的所有子集)
- 求一个集合的所有子集问题
- 求一个集合的所有子集 输出一个数所有平方和的情况 背包问题的递归解决
- [置顶] 求一个集合的所有子集问题
- 傻瓜方法求集合的所有子集问题(java版)
- 求一个集合的所有子集问题
- 求一个集合的所有子集问题
- 求一个集合的所有子集问题
- 用位运算获得集合的所有子集
- 一个集合所有子集和为sum的组合打印
- 递归求集合的所有子集的程序
- 程序员面试金典(动态规划):返回某集合的所有子集(java解法)
- 产生一个集合的所有子集
- 某个集合的子集问题
- 求集合子集问题
- 生成集合[n]的所有k-子集MATLAB代码
- 求一个集合所有可能的子集
- 利用格雷码找出集合的所有非空子集
- 使用递归求出一个集合的所有子集