产生可能集合

理论:

给定一组数字或符号,產生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合為:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。

解法;

如果不考虑字典顺序,则有个简单的方法可以產生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所產生的就是一个集合,例如:

 

000{}
001{3}
010{2}
011{2,3}
100{1}
101{1,3}
110{1,2}
111{1,2,3}


瞭解这个方法之后,剩下的就是如何產生二进位数?有许多方法可以使用,您可以使用unsigned型别加上&位元运算来產生,这边则是使用阵列搜寻,首先阵列内容全為0,找第一个1,在还没找到之前将走访过的内容变為0,而第一个找到的0则变為 1,如此重复直到所有的阵列元素都变為1為止,例如:

000 => 100 => 010 => 110 => 001 => 101 => 011 => 111
 
package 经典;

public class PossibleSet2 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        char[] b={'a','b','c'};
        possibleSet(b);
    }
    
    public static void possibleSet(char[] b){
        
        int[] a=new int[b.length];
        
        for(int each:a)
            each=0;
        
        while(true)
        {
            int i;
            
            System.out.print("{");
            for(int k=0; k<a.length; k++)
            {
                if(a[k]==1)
                    System.out.print(b[k]);
            }
            System.out.println("}");
            
            for(i=0; i<a.length && a[i]==1; a[i]=0, i++)
                ;
            
            if(i==a.length)
                break;
            else
            {
                a[i]=1;
            }
        }
    }
}

 

转载于:https://www.cnblogs.com/huangcongcong/p/4008403.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值