1.元素序列的排列与组合

组合序列:

void conbination(int n,int m,int a[],int b[],const int &M){ 
    for(int j=m;j<=n;j++){
        b[m-1]=a[j-1];
        if(m>1)
            conbination(j-1,m-1,a,b,M);
        else{
            for(int i=0;i<M;i++)
                printf("%d ",b[i]);
            printf("\n");
        }
    }
}

递归图解:

数学问题-排列组合

 

全排列:

void swap(int *p1,int *p2){
    int t=*p1;
    *p1=*p2;
    *p2=t;
}

void full_permutation(int a[],int t,int size){
    if(t==size){
        for(int i=0;i<size;i++)
            printf("%d ",a[i]);
        printf("\n");
    }
    else{
        for(int j=t;j<size;j++){
            swap(&a[j],&a[t]);
            full_permutation(a,t+1,size);//此处用到递归思想
            swap(&a[j],&a[t]);
        }
    }
}

将组合后的序列进行全排列,就得到了排列序列:

排列序列:

void permutation(int n,int m,int a[],int b[],const int &M){
    for(int j=m;j<=n;j++){
        b[m-1]=a[j-1];
        if(m>1)
            permutation(j-1,m-1,a,b,M);
        else{
            full_permutation(b,0,M);
        }
    }
} 

测试代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 100
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

void conbination(int n,int m,int a[],int b[],const int &M){ 
    for(int j=m;j<=n;j++){
        b[m-1]=a[j-1];
        if(m>1)
            conbination(j-1,m-1,a,b,M);
        else{
            for(int i=0;i<M;i++)
                printf("%d ",b[i]);
            printf("\n");
        }
    }
}

void swap(int *p1,int *p2){
    int t=*p1;
    *p1=*p2;
    *p2=t;
}

void full_permutation(int a[],int t,int size){
    if(t==size){
        for(int i=0;i<size;i++)
            printf("%d ",a[i]);
        printf("\n");
    }
    else{
        for(int j=t;j<size;j++){
            swap(&a[j],&a[t]);
            full_permutation(a,t+1,size);//此处用到递归思想
            swap(&a[j],&a[t]);
        }
    }
}

void permutation(int n,int m,int a[],int b[],const int &M){
    for(int j=m;j<=n;j++){
        b[m-1]=a[j-1];
        if(m>1)
            permutation(j-1,m-1,a,b,M);
        else{
            full_permutation(b,0,M);
        }
    }
} 

int main(){
int n=5,m=3;
int a[n];int b[m];

for(int i=0;i<n;i++)

a[i]=i+1;

const int M=m;
puts("组合序列"); 
conbination(n,m,a,b,M);
puts("全排列");
full_permutation(a,0,n);
puts("排列序列");
permutation(n,m,a,b,M);
    return 0;
}
View Code

相关文章: