View Code
/* 从{1,2,...,n}中求m个元素的组合全体为集合C。设a1,a2...am属于C, 不妨设a1<a2<...<am。此时,i<=ai<=n-m+i, i=1,2,3,...m. 令j=max{i|ai<n-m+i+1}.那么a1a2a3...am的下一组和为a1a2...a(j-1) (aj+1)(aj+2)...(aj+m-j) */ #include<iostream> using namespace std; void print(int *a,int m){//打印 int i; for(i=0;i<m-1;i++) cout<<a[i]<<' '; cout<<a[m-1]<<endl; } void Next(int *a,int n,int m){//寻找下一个数组 int i,j,t; print(a,m); for(j=m-1;j>=0;j--){ if(a[j]<n-m+j+1) break; } t=a[j]; for(i=0;i<=m-j-1;i++){ a[j+i]=t+i+1; } } void Initial(int *a,int n,int m){ int index; for(index=0;index<m;index++){//第一次初始化数组 a[index]=index+1; } index=0; while(index<=n-m){//此处是控制第一个数,使其,最后一个数不大于 n Next(a,n,m); if(a[0]>index+1) index++; } } int main(){ int n,m,temp=0,a[100]; cout<<"请输入n个不同元素的个数,和你想取出的m个元素进行组合的个数:"<<endl; while(cin>>n>>m){ //cout<<"Case:"<<++temp<<" n="<<n<<",m="<<m<<endl; Initial(a,n,m); cout<<"请输入n个不同元素的个数,和你想取出的m个元素进行组合的个数:"<<endl; } system("pause"); return 0; }
View Code
#include<iostream> using namespace std; void print(int *a,int m,int *b,int n){ for(int i=0;i<m;i++){ cout<<b[a[i]]<<" "; } cout<<endl; } void next(int *a,int m,int *b,int n){ print(a,m,b,n); int t,j; for(j=m-1;j>0;j--){ if(a[j]<n-m+j) break; } t=a[j]; for(int i=j;i<m;i++){ a[i]=t+1; t++; } } void inite(int *a,int m,int *b,int n){ for(int i=0;i<m;i++) a[i]=i; while(a[0]<=n-m){ next(a,m,b,n); } } int main(){ int n=6,m=4; int a[4],b[6]={1,2,3,4,5,6}; inite(a,m,b,n); return 0; }
从{1,2,...,n}中求m个元素的组合全体为集合C。设a1,a2...am属于C,不妨设a1<a2<...<am。此时,i<=ai<=n-m+i, i=1,2,3,...m.
令j=max{i|ai<n-m+i+1}.那么a1a2a3...am的下一组和为a1a2...a(j-1) (aj+1)(aj+2)...(aj+m-j)
#include<iostream> using namespace std; void print(int *a,int m){//打印 int i; for(i=0;i<m-1;i++) cout<<a[i]<<' '; cout<<a[m-1]<<endl; } void Next(int *a,int n,int m){//寻找下一个数组 int i,j,t; print(a,m); for(j=m-1;j>=0;j--){ if(a[j]<n-m+j+1) break; } t=a[j]; for(i=0;i<=m-j-1;i++){ a[j+i]=t+i+1; } } void Initial(int *a,int n,int m){ int index; for(index=0;index<m;index++){//第一次初始化数组 a[index]=index+1; } index=0; while(index<=n-m){//此处是控制第一个数,使其,最后一个数不大于 n Next(a,n,m); if(a[0]>index+1) index++; } } int main(){ int n,m,temp=0,a[100]; while(cin>>n>>m){ cout<<"Case:"<<++temp<<" n="<<n<<",m="<<m<<endl; Initial(a,n,m); cout<<endl; } system("pause"); return 0; }