总共有m个数字,从m个数字中找出n个数字的组合。
int b[100];
int m=10;//总共10个数字 0,1,2,3,4,5,6,7,8,9
int n=4;//选择4个数字
//从m中选取n个数 i表示当前选择的个数 i==n时候输出 k表示从第k个数字开始
void com(int i,int k)
{
if(i<n)
{
for(int j=k;j<=m-n+i;j++)//从k到m-n+i中找组合
{
b[i]=j;
com(i+1,j+1);
}
}
else
{
for(int p=0;p<n;p++)
cout<<b[p]<<" ";
cout<<endl;
}
}
调用
com(0,0)
上述的方案 看起来十分粗糙,下面是改进的方案。
n为组合包含元素个数, cur当前包含个数,col数组 id为编号
#define len 9
void test2(int n,int cur,std::vector<int> col,int id)
{
if(cur==n)
{
vector<int>::iterator iter=col.begin();
for(;iter!=col.end();iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
}
else
{
for(int k=id;k<len;k++)
{
col.push_back(k);
test2(n,cur+1,col,k+1);
col.pop_back();
}
}
}