#include "stdafx.h"
#include <stdio.h>
#include <vector>
using namespace std;
//找出n个自然数(1,2,3,…,n)中r个数的组合。例如,当n=5,r=3时 Com(5,3)
// 穷举搜索法 1
void Com1()
{
int i,j,k,t = 0;
int count = 0;
for(i = 5 ; i >=1 ; --i)
for(j = 5 ; j >=1 ;--j)
for(k = 5 ; k >=1 ;--k)
{
if(i != j && j != k &&i>j && j > k)
{
cout<<i<<" "<<j<<" "<<k<<endl;
t++;
}
count++;
}
cout<<"Total = "<<t<<" Counte Number = "<<count<<endl;
}
// 穷举搜索法 2
void Com2()
{
int i,j,k,t = 0;
int count = 0;
int n = 5;
int r =3;
for(i = n ; i >=r ; --i)
for(j = i-1 ; j >=r-1 ;--j)
for(k = j-1 ; k >=1 ;--k)
{
cout<<i<<" "<<j<<" "<<k<<endl;
t++;
count++;
}
cout<<"Total = "<<t<<" Counte Number = "<<count<<endl;
}
//这两个程序都有一个问题,当r变化时,循环重数改变,这就影响了这一问题的解,即没有一般性。
//递归法
int N = 10;
int R = 3;
int *a = new int[R];
int level = 0;
int count = 0;
int Com3(int n,int r)
{
int i;
if(r ==1)
{
for(int j = n ; j >= 1; --j )
{
for(int k = 0 ; k < R-1 ; ++k)
cout<<a[k]<<" ";
cout<<j<<endl;
count++;
}
level--;
return 0;
}
for(i = n ; i >= r; --i)
{
a[level++] = i;
Com3(i-1,r-1);
}
level--;
return 0;
}
void main()
{
Com3(N,R);
printf("Com(%d,%d) Total = %d /n",N,R,count);
}