太烦了,思路是这样:
设人数HumanCount,队数TeamCount
1、先进行拆数字,把HumanCount拆成TeamCount个数的和,包括0。如9个人,3个队,则把9拆开,有0+0+9,1+0+8等等。
具体做可以用排列算法解决,即从10个数(包括0)中取3个数,得到各种排列方案(如012、013、123、124、125......),然后遍历这些排列,三个数和为9的方案留下。
2、对以上每一个人数分配方案进行人数分配
如对上面的排列:(2,2,5),对每一个队作排列
第一个队从9人中取2人
第二个队从剩下7人中取2人
...........
排列组合的程序:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TVarList =array of Variant;
Tform1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
public
{ Public declarations }
functiondo
PRocess(Order:boolean;Vars:TVarList;level:Integer;Parentvar:TVarList=nil):string;
//Vars:是要组合内容,可以是任何类型,Level:是组合个数,ParentVar是当前已在组合中的内容
function AddVar(Vars:TVarlist):string;//将排列内容添加到字符串数组中
function AddVar1(Vars:TVarlist):string;//将组合内容添加到字符串数组中
end;
var
form1: Tform1;
sList:TStringList;
implementation
uses StrUtils;
{$R *.dfm}
function Tform1.DOPRocess(Order:boolean;Vars: TVarList;
level: Integer;Parentvar:TVarList):string;
var
iCOunt:Integer;
begin
SetLength(Parentvar,Length(Parentvar) +1);
if Level >1 then
for iCount := Low(Vars) to High(Vars) -1do
begin
Parentvar[High(ParentVar)] := Vars[iCount];
do
PRocess(Order,Copy(Vars,iCount+1,High(vars)),Level-1,Parentvar);
end
else
for iCOunt := Low(Vars) to High(Vars)do
begin
Parentvar[High(ParentVar)] := Vars[iCount];
if Order then
sList.Add(Addvar(parentvar))
else
sList.add(Addvar1(parentvar));
end;
Result:=sList.Text;
if Level=0 then
Result:='';
end;
function Tform1.AddVar(Vars: TVarlist):string;
var
i,j :Integer;
strs:string;
sList:TStringList;
begin
sList:=TStringList.Create;
for i:= Low(Vars) to High(Vars)do
begin
strs:='';
for j:=i to i+High(Vars)do
begin
if j>High(Vars) then
strs:=strs+Vartostr(vars[j-High(Vars)-1])
else
strs:=strs+VartoStr(vars[j]);
end;
if sList.IndexOf(strs)=-1 then
sList.Add(strs);
end;
Result:=trim(sList.Text);
sList.Free;
end;
function Tform1.AddVar1(Vars: TVarlist):string;
var
i :Integer;
strs:string;
begin
for i:= Low(Vars) to High(Vars)do
strs:=strs+VartoStr(vars);
Result:=strs;
end;
procedure Tform1.Button1Click(Sender: TObject);
var
Humans:TVarList;
m,n:Integer;
begin
sList:=TStringList.Create;
m:=4;
n:=3;
SetLength(Humans,m);
Humans[0]:= 1;
Humans[1]:= 2;
Humans[2]:= 3;
Humans[3]:= 4;
showmessage(DOPRocess(true,Humans,n));//从m个中选n个,有顺序
showmessage(DOPRocess(false,Humans,n));//从m个中选n个,无顺序
sList.Free;
end;
end.