子集三種生成方法 java
阿新 • • 發佈:2019-03-10
為什麽 位向量法 == %d 位向量 str 不能 一個 class
增量構造法
public class Main1 {
static int A[] = new int[1 << 7];
static int da[] = new int[1<<7];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
for (int i = 0; i < n; i++) {
da[i] = sc.nextInt();
}
print_subset(n, A, 0,da);
}
}
private static void print_subset(int n, int[] A, int cur,int da[]) {
// 打印當前集合
for(int i=0;i<cur;i++)
System.out.printf( "%d ",da[A[i]]); //如果不加da[]的話,這裏輸出的是下標值,位向量中同理
System.out.println();
int s = cur>0?A[cur-1]+1:0; //這個表示最小值的下標,cur不等於0的時候,即cur前面還有下標元素,為了得到全部的子集,所以這裏不能漏掉,便從最小的那一個選
//那為什麽A[cur-1]+1就是最小的下標呢,剛剛輸出的最後一個下標就是A[cur-1],所以這一個下標+1,即還未選擇過的最小下標
for(int i=s;i<n;i++){ A[cur]=i; print_subset(n, A, cur+1,da); } } }
位向量法
public class Main1 { static int b[] = new int[1 << 7]; static int da[] = new int[1 << 7]; public static void print(int n, int cur, int b[], int da[]) { if (cur == n) { for (int i = 0; i < n; i++) { if (b[i] == 1) System.out.printf("%d ", da[i]); } System.out.println(); return; } b[cur] = 1; print(n, cur + 1, b, da); b[cur] = 0; print(n, cur + 1, b, da); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); for (int i = 0; i < n; i++) da[i] = sc.nextInt(); print(n, 0, b, da); } } }
二進制法
public class Main1 { public static void sort(int n,int s,String str){ for(int i=0;i<n;i++) { int res = s&(1<<i);//看這2的n次方個數上哪些的位數是1。 if(res != 0) System.out.print(str.charAt(i));//然後打印子集即可。 } System.out.println(); } public static void main(String[] args){ Scanner sc = new Scanner(System.in); String str = sc.nextLine();//從控制臺得到字符串 int n = str.length(); for(int i=0;i<(1<<n);i++)//一共有2的n次方個子集 sort(n,i,str); } }
子集三種生成方法 java