排列组合算法

来源:互联网 发布:淘宝开店装修多少钱 编辑:程序博客网 时间:2024/05/22 07:47
#include <iostream>//#include <cmath>#include <string>#include <vector>//#include <deque>//#include <stack>//#include <cctype>using namespace std;//====================================================================================//方法一:数组法(01转换法)进行组合(n个数选m个进行组合)/*新建一个数组,其下标表示1到n个数,数组元素的值为1表示其代表的数被选中,为0则没选中。首先初始化,将数组前m个元素置1,表示第一个组合为前m个数。然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。当第一个“1”移动到数组的n-m的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。例如求5中选3的组合:【1 1 1 0 0】 //1,2,3【1 1 0 1 0】 //1,2,4【1 0 1 1 0】 //1,3,4【0 1 1 1 0】 //2,3,4【1 1 0 0 1】 //1,2,5【1 0 1 0 1】 //1,3,5【0 1 1 0 1】 //2,3,5【1 0 0 1 1】 //1,4,5【0 1 0 1 1】 //2,4,5【0 0 1 1 1】 //3,4,5*/void combine_array(vector<int>& input, vector<int>& idx,vector<vector<int> >& output,int m,int n){string str(m,'0');bool flag=true;for(int i=0;i<n;i++)str[i]='1';while(flag){int cnt=0;vector<int>tmp;for(int i=0;i<m;i++)if(str[i]=='1')tmp.push_back(input[i]);output.push_back(tmp);//cout<<str<<endl;for (int i=0;i<m-1;i++){if(str[i]=='1')cnt++;if(str[i]=='1' && str[i+1]=='0'){str[i]='0';str[i+1]='1';for(int j=0;j<i;j++)str[j]=j<cnt-1?'1':'0';break;}else if(i==m-2){flag=false;}}}}//====================================================================================//方法一的简便法:使用STL函数prev_permutation#include <iostream>#include <algorithm>using namespace std;int main(){ string str="84293";string idx="11100";do {for(int i=0;i<idx.size();i++)if(idx[i]=='1')cout<<str[i];cout<<endl;} while (prev_permutation(idx.begin(),idx.end()));return 0;}//====================================================================================//方法二:递归法进行组合/*a. 首先从m个数中选取编号最大的数,然后在剩下的m-1个数里面选取n-1个数,直到从m-(n-1)个数中选取1个数为止。b. 从m个数中选取编号次小的一个数,继续执行a步,直到当前可选编号最大的数为n。*/void combine_recursive(vector<int>& input, vector<int>& idx,vector<vector<int> >& output,int m,int n){static int N=n;for(int i=m;i>=n;i--){idx[n-1]=i-1;if(n>1)combine_recursive(input,idx,output,i-1,n-1);else{vector<int> tmp;for(int j=N-1;j>=0;j--){//cout<<input[idx[j]]<<" ";tmp.push_back(input[idx[j]]);}output.push_back(tmp);//cout<<endl;}}}int main(){int a[]={4,3,2,1,6};vector<int> T(a,a+5);vector<int> T_index(3,0);vector<vector<int> > output;combine_array(T,T_index,output,5,3);while(!output.empty()){vector<int> tmp=output.back();output.pop_back();while(!tmp.empty()){cout<<tmp.back()<<" ";tmp.pop_back();}cout<<endl;}system("pause");return 0;}

0 0
原创粉丝点击