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; }
  • 相关阅读:
    HDU 5087 (线性DP+次大LIS)
    POJ 1064 (二分)
    Codeforces 176B (线性DP+字符串)
    POJ 3352 (边双连通分量)
    Codeforces 55D (数位DP+离散化+数论)
    POJ 2117 (割点+连通分量)
    POJ 1523 (割点+连通分量)
    POJ 3661 (线性DP)
    POJ 2955 (区间DP)
    LightOJ 1422 (区间DP)
  • 原文地址:https://www.cnblogs.com/aijianiula/p/2457009.html
Copyright © 2011-2022 走看看