问题如下:
有m个数,想从中取出n个数进行组合,试问可以组成多少任意组合.
如m=(2,3,4,5) 取出(n=3)三个数字进行组合 得到组合如下
{2,3,4},{2,3,5},{3,4,5},{2,4,5} 得到4组
请问程序怎么实现.

解决方案 »

  1.   

    这里有一个方案,但不是最好的,还有个就是用递归,传两个参数,一个是数组,一个是要取多少位的量,递归减一就是。你看可以不,
    var
      Form1: TForm1;
      Tmparray : array [0..9] of integer;
    implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
    var
      I : Integer;
    begin
      for i := 0 to 9 do
        tmparray[i]:=i;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      I,J,K : integer;
    begin
      listbox1.Clear ;
      for i:=low(tmparray) to high(tmparray)-2 do
      begin
        for j:=i to high(tmparray)-1 do
        begin
          for k:=j to high(tmparray) do
            listbox1.Items.Add(inttostr(tmparray[i])+','+inttostr(tmparray[j])+','+inttostr(tmparray[k]));
        end;
      end;
    end;
      

  2.   

    这是一道很经典的程序员试题。用递归方法解。记得不是太清楚了。先提供这样的解法。
    列举从整数0至n-1中任取r个整数的所有组合。设求得组合中的各数分别存储于数据组C的C0,C1……Cr-1中,并假定C0<…n-r+i.如设n=5,r=3,则i<2+i(0<3)。由初始组合0,1,2开始,可心依次产生以下组合序列: 
    012,013,014,023,024,034,123,124,134,234 
    产生组合的方法是: 
    1. 对上一组合C0,C1,…Cr-1,自右端开始递增的Ci ; 
    2. 递增Ci后仍满足Ci的性质,表示可以开成下一个组合,则递增Ci,并顺序生成Ci+1至Cr-1; 
    3. 递增Ci后不满足Ci的性质,则回溯; 
    4. 直至i减至小于0为止。 
    ===example=====
    private static void compNumbers(int n,int r) 
    {
    int N =100;
    int[]c= new int[N];
    int i, j;

    //生成初始集
    for(j=0;j<r;j++)
    {
    c[j]=j;
    Console.Write(c[j]);
    }
    Console.WriteLine();

    i = r-1;
    do
    {
    if(c[i]<n-r+i)  /*如调整c[i]是可接受的*/ 
    {
    c[i]++; /*递增c[i]*/ 
    for(j=i+1;j<r;j++)
    {
    c[j]=c[j-1]+1;
    }
    for(j=0;j<r;j++)
    {
    Console.Write(c[j]);
    }
    Console.WriteLine();
      i = r-1;
    }
    else
    {
    i--;/*回溯*/ 
    }
    }while(i>=0); 
    }========================
      

  3.   

    function a(:nteger):integer;
    begin
    if n=1 then a:=1 else
    a:=n*a(n-1)
    end
     function b(m:integer):integer;
    begin
    if m=1 then b:=1
    else b:=m*b(m-1);
    procedure TForm1.Button1Click(Sender: TObject);
    var i:integer;
    begin
      i:=n/m
      edit1.text:=inttostr(i);
    end刚学的 不知道行不行啊?