组合算法

来源:互联网 发布:淘宝床单四件套 编辑:程序博客网 时间:2024/04/30 03:36

从csdn看到百度饭团 那道竞赛题,觉得可以用组合算法解决,用递归简单实现了组合算法,自己觉得还比较满意,呵呵,

用delphi 写的,

递归算法;大概思路如下:从M中取N个数,分两中情况处理

1. 从M中取一个,从剩下的M-1个数中取N N -1个数,

2.从M-1个数中去N 个数;

N =1 和N=M的情况可以结束递归;

procedure TForm1.presum(M: Integer; N: Integer; aIndex: Integer; aOut:String);
var
  tempStr: string;
  i: Integer;
begin
   if n = 1 then
   begin
    tempstr:= aOut;
    for i:= aIndex to MM do            
    begin
      aOut:= TempStr + copy(aArray, i, 1);
      Memo1.Lines.Add('--------------------');
      Memo1.Lines.Add(aOut) ;
    end;
   end
   else if m = n then
   begin
      aOut:= aOut + copy(aArray, aIndex, n);
      Memo1.Lines.Add('--------------------');
      Memo1.Lines.Add(aOut);
   end
   else begin
      presum(m - 1, n, aIndex + 1, aOut);
      aOut:= aOut + copy(aArray, aIndex, 1);
      presum(m - 1, n - 1, aIndex + 1, aOut);
   end;
end; 

procedure TForm1.Button1Click(Sender: TObject);
Var
  i: Integer;
begin
  MM:= StrToInt(edit1.Text);    //  简单,MM只能是1到9  aArray:= '';      
  NN:= StrToInt(edit2.Text);      //从MM 中取NN 个数,
 

    for i:= 1 to MM do
       aArray:= aArray + IntToStr(i);                       

  Memo1.Lines.Add('presum(' + edit1.Text + ', ' + edit2.Text + ')') ;
  presum(MM, NN, 1, aOut);
end;