1. 程式人生 > >數學問題-排列組合

數學問題-排列組合

ace scanf printf 分享圖片 就是 組合公式 int src spl

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

測試效果:

技術分享圖片


2.排列組合公式

排列公式 P(n,m)=n!/(n-m)!

代碼:

int P(int n,int m){
    int p=1;
    while(m){
        p*=n;
        n--;
        m--;
    }
    return p;
} 

代碼理解:其實就是累乘,nx(n-1)x(n-2)x……x(m+1)x(m)

--------------------------------------------------

組合公式 C(n,m)=P(n,m)/m!=n!/[m!(n-m)!]

int C(int n,int m){
    int i,c=1;
    i=m;
    while(i){
        c*=n;
        n--;
        i--;
    }
    while(m){
        c/=m;
        m--;
    }
    return c;
}

代碼理解:先求出P(n,m),再計算P(n,m)/m!

數學問題-排列組合