1. 程式人生 > >總結:組合與排列

總結:組合與排列

set bit pan 要求 兩個 erl its span 順序

組合與排列的區別就是組合的數字可以重復,但是排列的不行;

eg:組合:1 2 3 3 2 1 3 1 2......但是排列就只有1 2 3

所以可以發現排列的數字是要按單調遞增排列的,所以寫代碼時只要小小的改動一下就可以了,看一下例子:

例題一:輸出自然數1到n所有不重復的排列,即n的全排列,要求所產生的任一數字序列中不允許出現重復的數字。

#include<bits/stdc++.h>
using namespace std;
int a[1000+1];
bool b[1000+1];
void search(int k);
void print();
int n,num;
int
main(){ cin>>n; search(1); return 0; } void search(int k){ for(int i=1;i<=n;i++) if(!b[i]){ a[k]=i; b[i]=1; if(k==n) print(); else search(k+1); b[i]=0; } } void print(){ for(int i=1;i<=n;i++) cout
<<setw(5)<<a[i]; cout<<endl; }

例題二:

【題目描述】

排列與組合是常用的數學方法,其中組合就是從n個元素中抽出r個元素(不分順序且r≤n),我們可以簡單地將n個元素理解為自然數1,2,…,n,從中任取r個數。

現要求你用遞歸的方法輸出所有組合。

例如n=5,r=3,所有組合為:

1 2 3 1 2 4 1 2 5 1 3 4 1 3 5 1 4 5 2 3 4 2 3 5 2 4 5 3 4 5

【輸入】

一行兩個自然數n、r(1<n<21,1≤r≤n)。

【輸出】

所有的組合,每一個組合占一行且其中的元素按由小到大的順序排列,每個元素占三個字符的位置,所有的組合也按字典順序。

【輸入樣例】

5 3

【輸出樣例】

  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5
#include<bits/stdc++.h>
using namespace  std;
int n,m,b[1000000],a[1000000],c[100000];
int num=0;
void search(int);
void print();
int main(){

    cin>>n>>m;
    search(1);
} 
void search(int k){
    for(int i=1;i<=n;i++){
    if(!b[i]&&i>a[k-1]||k==1){//啦啦啦,這就是組合與排列的區別; 
            a[k]=i;
            b[i]=1;
            if(k==m) print();
            else search(k+1);
            b[i]=0;
        }
    }
}
void print(){
    //num++; 用來統計的;這道題用不到 
    for(int i=1;i<=m;i++) 
    cout<<setw(3)<<a[i];
    cout<<endl; 
}

好啦,就是這樣,好理解吧

總結:組合與排列