生成子集
2012-05-24 16:52
204 查看
#include<iostream> using namespace std; int visited[101]; //arry表示求子集的数组 //cur表示搜索当前位置 //n表示数组元素个数 void DFS(int *arry, int cur, int n)//字典序 { for(int i=0; i<cur; i++) if(visited[i]) cout<<arry[i]<<" "; if( cur != 0) cout<<endl; if( cur>=n ) return; for(int i=cur; i<n; i++) { if( !visited[i] ) { visited[i]=1; DFS(arry, i+1, n); visited[i]=0; } } } //arry表示求子集的数组 //cur表示搜索当前位置 //n表示数组元素个数 //num表示此次生成子集的元素个数 void DFS1(int *arry, int cur, int num, int n)//按子集元素个数 { if( num<=0) { for(int i=0; i<cur; i++) if(visited[i]) cout<<arry[i]<<" "; cout<<endl; return; } for(int i=cur; i<n; i++) { if( !visited[i] ) { visited[i]=1; DFS1(arry, i+1, num-1, n); visited[i]=0; } } } int main() { int n; int arry[101]; while( cin>>n ) { coun = 0; memset(visited, 0, sizeof(visited)); for(int i=0; i<n; i++) cin>>arry[i]; //按字典序生成 cout<<"按字典序生成:"<<endl; DFS(arry, 0, n); cout<<endl; //按子集元素个数 cout<<"按子集元素个数: "<<endl; for(int i=1; i<=n; i++) DFS1(arry, 0, i, n); cout<<endl; } }
![](http://my.csdn.net/uploads/201205/24/1337849872_4322.jpg)
相关文章推荐
- 递归枚举,子集生成,排列生成,回溯都是解决解答树的方法,通过数值跟踪保存排序过程
- 子集生成 增量构造法 位向量法 二进制法
- 算法竞赛入门经典读书笔记(四)7.3子集生成
- 子集生成
- 子集生成的两种方法
- {0~n-1}的所有子集生成算法(紫书P188)
- 子集生成
- u725子集生成
- 算法竞赛入门经典读书笔记(四)7.3子集生成
- 子集生成
- 增值构造法子集生成
- ZOJ Problem Set - 3861 ( DFS + 子集生成 + 有条件的全排列生成 )
- 子集生成算法——增量构造法
- uva 11205 The Broken Pedometer(经典的子集生成题目,在此总结了三种子集生成的方法~)
- 子集生成-复杂状态的动态规划(集合dp)预热
- 子集生成的两种方法
- UVA 1151 - Buy or Build(最小生成树,二进制子集生成)
- 子集生成
- 按字典序生成{1,2,...,n}的r子集的算法-组合数学
- 减治法(三) 生成子集的减治算法及二进制码法