方法一:
问题:从含有M个元素的集合中任选n个的排列组合。
思路:利用M进制的数组来表示源程序如下(在C-Free 3.5中测试)
/*-----------------------------------------------------------------------
Author : RainFly(傲月寒星)
3-25-05
Describe:关于幂集的一个算法,也是从m个元素中任选n个
的算法.
if you have other ideas,please email me:yan_diao266071@163.com
Test in C-Free 3.5
------------------------------------------------------------------------*/
#include <iostream>
#include <vector>
#include <stdlib.h>
#include <string>
using namespace std;
void ssort(int n,int str[],int m,int N);
int main()
{
int i,N,j=0,m,count,temp,i_begin=1,i_end,M,flag=0;
vector <string> iInt;
string ss;
cout<<"How many elements do you want the set include:";
cin>>M;
cout<<"Please input "<<M<<"elements:";
int * str=new int[M];
vector <string>::iterator vi;
for (i = 0; i <M; i++)
{
cin>>ss;
iInt.push_back(ss);
}
cout<<endl;
cout<<"The elments of this set is:";
for (vi = iInt.begin(); vi != iInt.end(); vi++)
cout<<*vi<<" ";
cout<<endl;
/*
output n elements
*/
cout<<"Please input a number(0~"<<M<<"):";
cin>>N;
//insure the scope of i
for(i=0;i<N-2;i++)
i_begin=i_begin*M;
i_end=i_begin*M*M;
if(i_begin==1)
i_begin=0;
if(N==1)
i_end=M;
for(i=i_begin;i<i_end;i++)
{
flag=0;
ssort(i,str,M,N);
for(j=0;j<N-1;j++)
for(m=j+1;m<N;m++)
if(str[j]>=str[m])
flag=1;
if(flag)
continue;
cout<<"<";
for(j=0;j<N;j++)
{
if(j!=N-1)
cout<<iInt[str[j]]<<",";
else
cout<<iInt[str[j]];
}
cout<<">";
}
delete [] str;
return 0;
}
void ssort(int n,int str[],int m,int N)
{
int i=0,count=0,temp;
while(n>=0)
{
if(n<m)
{
str[i]=n;
count++;
break;
}
str[i]=n%m;
n=n/m;
count++;
i++;
}
//sort this array
if(N>1&&count<N)
str[i+1]=0;
for(i=0;i<N/2;i++)
{
temp=str[i];
str[i]=str[N-i-1];
str[N-i-1]=temp;
}
}
Example:
How many elements do you want the set include:5
Please input 5 elements:a1 a2 a3 a4 a5
The elments of this set is:a1 a2 a3 a4 a5
Please input a number(0~5):2
<a1,a2><a1,a3><a1,a4><a1,a5><a2,a3><a2,a4><a2,a5><a3,a4><a3,a5><a4,a5>
方法二:
#include <iostream.h>
int combine(int a[], int m, int n)
{
n = n > m ? m : n;
int* order = new int[n+1];
for(int i=0; i<=n; i++)
{
order[i] = i-1;
}
int count = 0;
int k = n;
bool flag = true;
while(order[0] == -1)
{
if(flag)
{
for(i=1; i<=n; i++)
{
cout << a[order[i]] << " ";
}
cout << endl;
count++;
flag = false;
}
order[k]++;
if(order[k] == m)
{
order[k--] = 0;
continue;
}
if(k < n)
{
order[++k] = order[k-1];
continue;
}
if(k == n)
{
flag = true;
}
}
delete[] order;
return count;
}
int main()
{
const int M = 5;
const int N = 3;
int a[M];
int b[N];
for(int i=0;i<M;i++)
{
a[i] = i+1;
}
combine(a,M,N);
return 0;
}