请问:
    我的问题如下:
        我想求解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,对的,但是怎么编程求出所有的组合情况呢?
    麻烦大家了

解决方案 »

  1.   

    for( i=1; i<=5; i++ )
     for( j=i+1; j<=5; j++ )
      for( k=j+1; k<=5; k++ )
        //print (i,j,k)
      

  2.   

    这个肯定要用递归了吧,楼上的这种m,n一变就不行了……
    我的递归解法如下:#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);
    }
    }
    }要换成别的数字,就把现在得到的数作为数组下标吧。
      

  3.   

    谢谢truewill(无处不在)的回复,但是我的问题中的m是个变量,用你的方法就是要写m层嵌套的for循环,那好像不行的吧?
      

  4.   

    w_anthony() 的回复还没看完,先谢谢了,呵呵,对我来说,有些难看懂呢,有问题我还要问呢
      

  5.   

    w_anthony 你好,麻烦你帮我解释一下下面的循环好吗?
    for (i=(pos==0?0:a[pos-1]+1);i<=n-m;i++)
    {
    a[pos]=i;
             zh(a,n,m-1,pos+1);
    }
      

  6.   

    其实和truewill的三层循环差不多,因为现在不确定几层,所以用了这个递归,"(pos==0?0:a[pos-1]+1)"这个是初始值,pos为0的时候初始值是0,其余情况下是前一个的数值加1,你看看truewill写的"for( i=1; i<=5; i++ )"和"for( j=i+1; j<=5; j++ )"的初始值那里,应该可以看明白一点端倪
      

  7.   

    谢谢w_anthony的解释,我现在明白了,同时也要谢谢truewill