1.增量构造法
view code
void print_subset(int n, int* a, int cur) { for(int i = 0; i < cur; i++) printf("%d",a[i]); //递归一次,打印一次 printf("\n"); int s = cur?a[cur-1]+1:0; //当前元素最小可能值 for(int i = s; i < n; i++) { a[cur] = i; print_subset(n,a,cur+1); //若当前元素值小于n,继续递归 } }
2.位向量法
void print_subset(int n, int cur) { if(n == cur) { for(int i = 0; i < n; i++) if(b[i])printf("%d",i); printf("\n"); return; } b[cur] = 1; print_subset(n,cur+1); b[cur] = 0; print_subset(n,cur+1);
3.二进制法
void print_subset(int n,int s) { for(int i = 0; i < n; i++) if(s&(1<<i)) printf("%d",i); printf("\n"); } scanf("%d",&n); for(int i = 0; i < (1<<n); i++) print_subset(n,i); //枚举集合编号
时间: 2024-10-17 19:35:09