子集生成(增量构造法、位向量法)

2019-01-03  本文已影响0人  小烈yhl

一、增量构造法

给定n个数字,枚举出所有可能的子集
例如给定n=3,枚举出{1,2,3}所有可能的子集
{1}、{2}、{3}、{1,2}、{1,2,3}、{2,3}

image.png

以下是java实现

public class sublist {
    public static void subset(int n, int A[], int cur) {
        for (int i = 0; i < cur; i++)
            System.out.printf("%d", A[i]);//打印当前集合
        System.out.println();
        int s;
        if (cur != 0) //如果cur=0,则从1开始,cur!=0,从A[cur - 1] + 1开始,由于数组坐标性质决定的
            s = A[cur - 1] + 1;
        else
            s = 1;
        for (int i = s; i <= n; i++) {
            A[cur] = i;
            subset(n, A, cur + 1);//递归构造子集
        }

    }

    public static void main(String[] args) {
        int n = 4;
        int A[] = new int [n];
        sublist.subset(n, A, 0);
    }

}

二、位向量法

构造一个位向量,只有当B[i] = 1时才打印该处位置的i值+1

image.png
public class sublistB {
    
    public static void sublist(int n, int[] B,int cur) {
        if(cur == n) {
            for(int i = 0; i < n;i++)
                if(B[i] > 0)
                    System.out.print(i+1+" "); //打印当前集合
            System.out.println();
            return;
        }
        
        B[cur] = 1;  //选第cur个元素
        sublist(n,B,cur+1);
        B[cur] = 0;  //不选第cur个元素
        sublist(n,B,cur+1);
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] B = new int[n];
        sublistB.sublist(n, B, 0);
    }

}

上一篇下一篇

猜你喜欢

热点阅读