排列组合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; }
原文地址:https://www.cnblogs.com/aijianiula/p/2457009.html