美文网首页
子集生成(增量构造法、位向量法)

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

作者: 小烈yhl | 来源:发表于2019-01-03 13:06 被阅读0次

    一、增量构造法

    给定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);
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:子集生成(增量构造法、位向量法)

          本文链接:https://www.haomeiwen.com/subject/hxjfrqtx.html