![]()
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;
}