7.3子集生成
7.3.1增量构造法(给定一个集合,枚举子集)
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); //递归构造子集
}
}
7.3.2位向量法
第二种思路是构造一个位向量B[i],而不是直接构造子集A本身,其中B[i]=1,当且仅
当i在子集A中。递归实现如下:
void print_subset(int n, int* B, int cur) {
if(cur == n) {
for(int i = 0; i < cur; i++)
if(B[i]) printf("%d ", i); //打印当前集合
printf("\n");
return;
}
B[cur] = 1; //选第cur个元素
print_subset(n, B, cur+1);
B[cur] = 0; //不选第cur个元素
print_subset(n, B, cur+1);
}
7.3.3
二进制法