组合数是我们中学时期便已经接触到的概念,根据n,m求出所有的组合数的数目,但是如何利用程序编写一段优秀的求解程序呢?
以下是一个递归的小程序:
递归:
首先说明一下C(n,m)表示从n个元素中取出m个的组合。
(1)确定第一个位置可以取得的所有值存入辅助数组b。
(2)递归C(n-1,m-1),即由于前面已经确定一个数,因此本次递归相当于容量n-1,所取的数m-1。
(3)判结束,当递归m次即结束。
#include <iostream>
using namespace std;
//a为存放待组合的数值,b为用于暂存的数组
//n,m代表从n中取出m个数的组合
// M=m M用于输出
void c(int a[],int b[],int n, int m,const int M)
{
if (m>0)
{
for (int i =n;i>=m;i--)
{
b[m-1]=a[i-1];
//由于确定了当前位置的值
//则下次递归c(n-1,m-1)
c(a,b,i-1,m-1,M);
}
}
else
{
for(int i =0 ; i<M;i++)
cout<<b[i]<<" ";
cout<<endl;
}
}
int main ()
{
int arr[]={0,1,2,3,4,5,6};
int b[7];
c(arr,b,7,5,5);
return 0;
}