当前位置 博文首页 > m0_53521757的博客:蛮力法求解幂集问题

    m0_53521757的博客:蛮力法求解幂集问题

    作者:[db:作者] 时间:2021-07-15 15:34

    蛮力法求解幂集问题

    直接穷举求解,将1-n存放到数组a中,求解问题变为构造集合a的所有子集合。设集合a[0…2]={1,2,3},其所有集合元素对应的二进制位及其十进制位如下表所示。

    集合元素对应的二进制位对应的十进制位
    { }
    {1}0011
    {2}0102
    {1,2}0113
    {3}1004
    {1,3}1015
    {2,3}1106
    {1,2,3}1117

    因此对于含有n(n≥1)个元素的集合a,求幂集的过程如下

    for(i=0;i<2^n;i++)        //穷举a的所有集合元素并输出
    {  将i转换为二进制b;
       输出b中为1的位对应的a元素构成的一个集合元素;
    }
    

    采用直接穷举法求a={1,2,3}的幂集的完整程序如下:

    //蛮力法求解幂集问题
    #include <stdio.h>
    #include <math.h>
    #define MaxN 10
    void inc(int b[],int n)           //将b表示的二进制数增1
    {
    	for(int i=0;i<n;i++)          //遍历数组b
    	{
    		if(b[i]==1)           //将元素1改为0
    			b[i]=0;           
    		else
    		{
    			b[i]=1;       //将元素改为0改为1并退出for循环(因为只增加1)
     			break;
    		}
    	}
    }
    void PSet(int a[],int b[],int n)   //求幂集
    {
    	int i,k;
    	int pw=pow((float)2,n);      //求2^n
    	printf("1-%d的幂集:\n",n);
    	for(i=0;i<pw;i++)        //执行2^n
    	{
    		printf("{ ");
    		for(k=0;k<n;k++)    //执行n次
    		{
    			if(b[k]==1)
    				printf("%d ",a[k]);
    		}
    		printf(" } ");
    		inc(b,n);      //b表示的二进制数增1
    	}
    	printf("\n");
    }
    void main()
    {
    	int n=3;
    	int a[MaxN],b[MaxN];
    	for(int i=0;i<n;i++)
    	{
    		a[i]=i+1;     //a初始化为{1,2,3}
    		b[i]=0;       //b初始化为{0,0,0}
    	}
    	PSet(a,b,n);
    }
    

    输出结果
    在这里插入图片描述

    cs