package com.raylew.algorithm.other;
/**
* 求一个集合的幂集,递归求解
*/
public class 子集 {
public static void main(String[] args) {
int A[] = new int[4];
print_subset1(A.length, A, 0);
System.out.println("===========分割线============");
print_subset2(A.length, A, 0);
System.out.println("===========分割线============");
print_subset3(A.length);
}
/**
* 增量构造法
*
* @param n
* @param A
* @param cur
*/
public static void print_subset1(int n, int[] A, int cur) {
for (int i = 0; i < cur; i++) {
System.out.print(A[i] + " ");
}
System.out.println();
int s;
if (cur > 0) {
s = A[cur - 1] + 1;
} else {
s = 0;
}
for (int i = s; i < n; i++) {
A[cur] = i;
print_subset1(n, A, cur + 1);
}
}
/**
* 位向量法
*
* @param n
* @param B
* @param cur
*/
public static void print_subset2(int n, int[] B, int cur) {
if (cur == n) {
for (int i = 0; i < cur; i++) {
if (B[i] == 1) {
System.out.print(i + " ");
}
}
System.out.println();
} else {
B[cur] = 1;
print_subset2(n, B, cur + 1);
B[cur] = 0;
print_subset2(n, B, cur + 1);
}
}
/**
* 二进制法
* @param n
*/
public static void print_subset3(int n){
int setCount=(int)Math.pow(2,n);
for(int i=0;i<setCount;i++){
String pattern=Integer.toBinaryString(i);
if(pattern.length()<n){
StringBuilder appendStr=new StringBuilder();
for(int j=0;j<n-pattern.length();j++){
appendStr.append("0");
}
appendStr.append(pattern);
pattern=appendStr.toString();
}
for (int j = 0; j < n; j++) {
if (pattern.charAt(j) == '1') {
System.out.print(j + " ");
}
}
System.out.println();
}
}
}