以下是20取3的代码,你可以将数组改为100,也可以重定义,也可以将变量m,n作为参数,注意n>=m:
procedure TForm1.SetIt();
var
a:array[1..20]of integer;
i,j,t,r,k,n,m,step:integer;
begin
n:=10;
m:=3;
t:=1;step:=0;
for j:=1 to m do begin
a[j]:=0;
while t>0 do begin
a[t]:=a[t]+1;
if a[t]>n then t:=t-1
else begin
r:=0;
for i:=1 to t-1 do
if a[t]=a then r:=100;
if r<>100 then begin
if t=m then begin
step:=step+1;
for k:=1 to t do begin
if k=1 then SL.Add('');
SL[SL.Count-1]:=SL[SL.Count-1]+' '+inttostr(a[k]);
end;
end;
if t<m then begin
//t:=t+1;a[t]:=0
{将a[t]:=0改为a[t]:=a[t-1],则为组合}
t:=t+1;a[t]:=a[t-1]
end;
end;
end;
end;
end;
end;
调用方式为:
procedure TForm1.Button1Click(Sender: TObject);
begin
if SL<>nil then FreeAndNil(SL);
SL:=TStringList.Create;
SetIt;
memo1.Text:=SL.CommaText;
end;
获得结果之后,你将相应位置的字符串替换,比如:
原来的顺序为:A,B,C,D,E,F工5个,取任意三个,那么n=5,m=3,获得SL元素结果和真实结果为:
1 2 3:A B C
1 2 4:A B D
1 2 5:A B F
1 3 4:A C D
1 3 5:A C F
1 4 5:A D F
2 3 4:B C D
2 3 5:B C F
2 4 5:B D F
3 4 5:C D E
你自己完成剩下的工作吧