子集生成
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; // 这句重要。用到了定序技巧, 规定集合a中元素编号从小到大排列。 for ( int i = s; i < n; i++ ) { a[cur] = i; print_subset(n, a, cur+1); } }
2. 定位向量法。
void print_subset(int n, int *a, int cur) { if ( n == cur ) { for ( int i = 0; i < n; i++ ) { if ( a[i]==1 ) printf("%d ", N[i]); } printf("\n"); return; } a[cur] = 0; print_subset(n, a, cur+1); a[cur] = 1; print_subset(n, a, 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"); } int main() { for ( int i = 0; i < (1<<L); i++ ) print_subset(L, i); return 0; }