//**********************//
//按字典序生成组合的算法//
//在Vs2005下调试通过 //
//**********************//
#define MAX 10
int num[MAX];
int counter=1;
int find(int n,int elem)
{
int i;
for(i=1;i<=n;i++)
if(num[i]==elem)
return 1;
return 0;
}
//递归调用生成下一个组合,m,n为C(m,n)中的m,n
//找到这样的n:a[n]+1<=n且a[n]+1不属于num[]
void next(int m,int n,int he)
{
int i,j;
int temp;
for(i=1;i<=n;i++)
printf("%d ",num[i]);
printf("/n");
if(counter==he) return ;
for(i=n;i>=1;i--)
{
if(num[i]+1<=m && !find(n,num[i]+1))
{
temp=num[i]+1;
for(j=i;j<=n;j++)
{
num[j]=temp++;
}
break;
}
}
counter++;
next(m,n,he);
}
//阶乘m!
int factor(int n)
{
if(n==1)
return 1;
else
return n*factor(n-1);
}
//组合C(m,n)
int assemble(int m,int n)
{
return factor(m)/(factor(n)*factor(m-n));
}
/*
void main()
{
int i;
for(i=1;i<=4;i++) num[i]=i;
next(6,4,assemble(6,4));
}*/