请问:
我的问题如下:
我想求解n个不同数中含m(m<=n)个数的所有组合,比如:5个数是(1,2,3,4,5),从中求所有3个数的组合有(1,2,3)(1,2,4)(1,2,5)(1,3,4)(1,3,5)(1,4,5)(2,3,4)(2,3,5)(2,4,5)(3,4,5)共10个根据组合数学(5*4*3)/(3*2*1)=10,对的,但是怎么编程求出所有的组合情况呢?
麻烦大家了
我的问题如下:
我想求解n个不同数中含m(m<=n)个数的所有组合,比如:5个数是(1,2,3,4,5),从中求所有3个数的组合有(1,2,3)(1,2,4)(1,2,5)(1,3,4)(1,3,5)(1,4,5)(2,3,4)(2,3,5)(2,4,5)(3,4,5)共10个根据组合数学(5*4*3)/(3*2*1)=10,对的,但是怎么编程求出所有的组合情况呢?
麻烦大家了
for( j=i+1; j<=5; j++ )
for( k=j+1; k<=5; k++ )
//print (i,j,k)
我的递归解法如下:#include "stdio.h"
#include "stdlib.h"void zh(int *a,int n,int m,int pos/*=0*/);
void main()
{
int *a,m,n;
scanf("%d%d",&n,&m);
a=(int*)malloc(sizeof(int)*n);
zh(a,n,m,0);
free(a);
}void zh(int *a,int n,int m,int pos)
{
int i;
if (m==0)
{
for(i=0;i<pos;i++) printf("%d ",a[i]+1);
printf("\n");
}
else
{
for (i=(pos==0?0:a[pos-1]+1);i<=n-m;i++)
{
a[pos]=i;
zh(a,n,m-1,pos+1);
}
}
}要换成别的数字,就把现在得到的数作为数组下标吧。
for (i=(pos==0?0:a[pos-1]+1);i<=n-m;i++)
{
a[pos]=i;
zh(a,n,m-1,pos+1);
}