• 生成组合的两种方法


    生成组合的两种方法

    方法1:搜索

    代码

    #include<iostream>
    using namespace std;
    char S[5]={'A', 'B', 'C', 'D'};             //大小为4的集合S,0号不用
    char zh[5];                                 //存放组合的数组,0号不用
    int  nS=4;                                  //集合S的大小
    int  cnt=0;                                 //非空集合的个数
    
    void zuhe1(int k, int start){               //k用来控制递归的层数,不超过nS
    	for(int i=start; i<=nS; i++){           //增加元素的选择范围:S[start]~S[nS]
    		zh[k]=S[i];                         //添加一个元素,就构成一个组合
    		cnt++;                              //计数器加1
    		for(int x=1; x<=k; x++)             //输出当前组合
    		    cout<<zh[x];
    		cout<<endl;
    		if(k<nS) zuhe3(k+1, i+1);           //k<nS时,才可以递归
    	}	
    }
    
    int main(){
        zuhe1(1, 1);
        cout<<cnt;
        return 0;
    }
    

    输出结果

    A                               //这样达到的是组合效果,如果不限定start位置,就成了排列
    AB
    ABC
    ABCD
    ABD
    AC
    ACD
    AD
    B
    BC
    BCD
    BD
    C
    CD
    D
    15
    

    方法2:搜索+回溯

    代码

    #include<iostream>
    using namespace std;
    char S[5]={' ', 'A', 'B', 'C', 'D'};                //大小为4的集合S,0号不用
    char ztS[5];                                        //S每个元素的状态,有 或 没有
    int  nS=4;                                          //S集合的大小
    int  cnt=0;                                         //非空集合的个数
    
    void zuhe2(int k){                                  //k用来控制递归的层数,不超过nS
    	if(k==nS+1){                                    //终止条件,nS个元素的状态已明确
    		cnt++;                                      //计数器加1
    		for(int i=1; i<=nS; i++)                    //输出组合
    			if(ztS[i])	cout<<S[i];
    		cout<<endl;
    		return;                                     //返回
    	}
    	ztS[k]=1;                                       //未达终止条件:有S[k]的组合,左子树
    	zuhe2(k+1);                                     //递归
    	ztS[k]=0;                                       //未达终止条件:无S[k]的组合,右子树
    	zuhe2(k+1);                                     //递归
    }
    
    int main(){
    	zuhe2(1);
    	cout<<cnt-1;			                        //要减去一个空集 
    	return 0;
    }
    

    输出结果

    ABCD                                                //个数为2^4-1,为二叉树的15个叶子
    ABC
    ABD
    AB
    ACD
    AC
    AD
    A
    BCD
    BC
    BD
    B
    CD
    C
    D
    
    15
    
  • 相关阅读:
    给未来的你——李开复2011级大学新生演讲
    李开复致信中国大学生:大学4年应是这样度过
    sublime中空格和tab的区分
    ffmpeg开发中的问题(九)
    ffmpeg开发中的问题(八)
    ffmpeg开发中出现的问题(七)
    ffmpeg开发中出现的问题(六)
    ffmpeg开发中出现的问题(五)
    ffmpeg源码学习
    ffmpeg开发出现的问题(四) ftp/rstp/ts 流输出
  • 原文地址:https://www.cnblogs.com/lfyzoi/p/6938775.html
Copyright © 2020-2023  润新知