子集生成-增量构造法||位向量法
#include<bits/stdc++.h> using namespace std; int arr[25]; void print_subset(int n,int* A,int cur) { int i; for(i=0;i<cur;i++) printf("%d ",arr[A[i]]); puts("");int s; if(cur==0) s=0; else s=A[i-1]+1; //相当于int s=cur?A[cur-1]+1:0; //当cur=0的时候,因为这是第一次进入函数,所以选取集合下标为0即可 for(int i=s;i<n;i++) { A[cur]=i; print_subset(n,A,cur+1); } //然后就是从当前最小的还未选择过的下标作为下一个下标集合的首元素开始选取 //直到n-1的下标位置,每一次选取首下标之后都开始递归 } int main() { int n,A[25];//数组A辅助构造,其值为升序序列的下标,注意是从0开始 for(int i=0;i<25;i++) A[i]=i; scanf("%d",&n); for(int i=0; i<n; i++) arr[i] = i+1;//数组arr为1-n的值 print_subset(n,A,0); return 0; }
位向量法:
#include<bits/stdc++.h> using namespace std; void print_subset(int n,int* B,int cur) { if(cur==n)//当判断到了最后一个元素是否存在后 { for(int i=0;i<n;i++) { if(B[i]) printf("%d ",i); } puts(""); return; } B[cur]=1;//选择第cur个元素 print_subset(n,B,cur+1); B[cur]=0;//不选择 print_subset(n,B,cur+1); } int main() { int n; cin>>n; int B[100]; print_subset(n,B,0); return 0; }