从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;