zoukankan      html  css  js  c++  java
  • 排列组合C++

    View Code
    /*
    从{1,2,...,n}中求m个元素的组合全体为集合C。设a1,a2...am属于C,
    不妨设a1<a2<...<am。此时,i<=ai<=n-m+i, i=1,2,3,...m.
    令j=max{i|ai<n-m+i+1}.那么a1a2a3...am的下一组和为a1a2...a(j-1) (aj+1)(aj+2)...(aj+m-j)
    */
    #include<iostream>
    using namespace std;
    void print(int *a,int m){//打印 
        int i;
        for(i=0;i<m-1;i++) 
           cout<<a[i]<<' ';
        cout<<a[m-1]<<endl;
        
    }
    void Next(int *a,int n,int m){//寻找下一个数组 
        int i,j,t;
        print(a,m);
        for(j=m-1;j>=0;j--){
            if(a[j]<n-m+j+1)
            break;
        }
        t=a[j];
        for(i=0;i<=m-j-1;i++){
            a[j+i]=t+i+1;
            
        }
    }
    void Initial(int *a,int n,int m){
        int index;
        for(index=0;index<m;index++){//第一次初始化数组 
            a[index]=index+1;
        }
        index=0;
        while(index<=n-m){//此处是控制第一个数,使其,最后一个数不大于 n
            Next(a,n,m);
            if(a[0]>index+1) index++;
        }
    }
    int main(){
        int n,m,temp=0,a[100];
        cout<<"请输入n个不同元素的个数,和你想取出的m个元素进行组合的个数:"<<endl;
        while(cin>>n>>m){
            //cout<<"Case:"<<++temp<<" n="<<n<<",m="<<m<<endl;
            Initial(a,n,m);
            cout<<"请输入n个不同元素的个数,和你想取出的m个元素进行组合的个数:"<<endl;
        }
        system("pause");
        return 0;
    }
    View Code
    #include<iostream>
    using namespace std;
    void print(int *a,int m,int *b,int n){
        for(int i=0;i<m;i++){
            cout<<b[a[i]]<<"   ";
        }
        cout<<endl;
    }
    
    void next(int *a,int m,int *b,int n){
        print(a,m,b,n);
        int t,j;
        for(j=m-1;j>0;j--){
            if(a[j]<n-m+j)
            break;
        }
        t=a[j];
        for(int i=j;i<m;i++){
            a[i]=t+1;
           t++;
        }      
           
    }
    void inite(int *a,int m,int *b,int n){
        for(int i=0;i<m;i++)
           a[i]=i; 
        while(a[0]<=n-m){
            next(a,m,b,n);
        }
    }
    int main(){
        int n=6,m=4;
        int a[4],b[6]={1,2,3,4,5,6};
        inite(a,m,b,n);
        return 0;
    }
    从{1,2,...,n}中求m个元素的组合全体为集合C。设a1,a2...am属于C,不妨设a1<a2<...<am。此时,i<=ai<=n-m+i, i=1,2,3,...m.
    令j=max{i|ai<n-m+i+1}.那么a1a2a3...am的下一组和为a1a2...a(j-1) (aj+1)(aj+2)...(aj+m-j)

    #include<iostream> using namespace std; void print(int *a,int m){//打印 int i; for(i=0;i<m-1;i++) cout<<a[i]<<' '; cout<<a[m-1]<<endl; } void Next(int *a,int n,int m){//寻找下一个数组 int i,j,t; print(a,m); for(j=m-1;j>=0;j--){ if(a[j]<n-m+j+1) break; } t=a[j]; for(i=0;i<=m-j-1;i++){ a[j+i]=t+i+1; } } void Initial(int *a,int n,int m){ int index; for(index=0;index<m;index++){//第一次初始化数组 a[index]=index+1; } index=0; while(index<=n-m){//此处是控制第一个数,使其,最后一个数不大于 n Next(a,n,m); if(a[0]>index+1) index++; } } int main(){ int n,m,temp=0,a[100]; while(cin>>n>>m){ cout<<"Case:"<<++temp<<" n="<<n<<",m="<<m<<endl; Initial(a,n,m); cout<<endl; } system("pause"); return 0; }
  • 相关阅读:
    在.net中读写XML方法的总结
    C# 中的委托和事件
    周永亮 《我是职业人》
    .net序列化及反序列化
    .NET中的参数
    linux解压tar命令
    Linux date 命令使用技巧
    经典.net面试题目
    switch……case里的case能不能同时定义多个值呢?
    这里将是我学习进步的一个见证点
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2457009.html
Copyright © 2011-2022 走看看