輸出N個數中取M個數的所有組合,排列情況
阿新 • • 發佈:2019-02-15
一般思路是由組合算排列,現在藉助Next_permutation函式由排列到組合。
1.組合
讀入一個字串,一個整數n,輸出字串中取n個字元的所有組合情況
演算法:藉助Next_permutation函式,構造一個大小為len=str.length()的陣列,0表示要輸出的數,1表示不要輸出的數。
程式碼如下:
#include <iostream> #include <string> #include <algorithm> #include <memory.h> using namespace std; int main() { string str; int n; cin>>str>>n; int len=str.length(); int a[100]; memset(a,1,sizeof(a)); for(int i=0;i<n;i++) a[i]=0; do { for(int i=0;i<len;i++) { if(a[i]==0) cout<<str[i]; } cout<<endl; }while(next_permutation(a,a+len)); system("pause"); return 0; }
2.排列
#include <iostream> #include <string> #include <algorithm> #include <memory.h> using namespace std; int main() { string str; int n; cin>>str>>n; int len=str.length(); int a[100]; char b[100]; memset(a,1,sizeof(a)); for(int i=0;i<n;i++) a[i]=0; do { int j=0; for(int i=0;i<len;i++) { if(a[i]==0) { b[j]=str[i]; j++; } } do { for(int i=0;i<j;i++) cout<<b[i]; cout<<endl; }while(next_permutation(b,b+j)); cout<<endl; }while(next_permutation(a,a+len)); system("pause"); return 0; }
排列回溯:
#include <iostream> using namespace std; const int n=4;//總的元素數 const int m=3;//需要排列的元素個數 int num[m];//記錄狀態的陣列,儲存各個位置的排列元素 bool is_valid(int count) //判斷第count次取數是否合理 { for(int i=0;i<count;++i) { if(num[i]==num[count]) { return false; } } return true; } void choose_num(int count) //第count次選數 { if(count==m)//選取的排列元素夠了 { for(int i=0; i<m; ++i) { cout<<num[i]; } cout<<endl; return; } for(int i=1;i<=n;++i)//如果沒選夠,選擇一個數,合理後遞迴呼叫 { num[count]=i; if(is_valid(count)) { choose_num(count+1); } } } int main() { choose_num(0); }