總結:組合與排列
阿新 • • 發佈:2018-10-19
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; intmain(){ 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; }
好啦,就是這樣,好理解吧
總結:組合與排列