数组分段组合问题求解(200分) ( 积分: 200 )

P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
现有N个不重复的整数,要分成M段,求所有可能的分段情况并输出。因对递归算法不熟悉,请高手帮忙给段代码,万分感谢!
举例:现有整形数组I[1]..[25],分别赋值为1-25,平均分7段,多余的元素平均分配到个段中,则分7段的情况为:4,4,4,4,3,3,3。求这7段所有可能的组合。
 
D

Delphiguanshui

Unregistered / Unconfirmed
GUEST, unregistred user!
幫頂。。。。。。
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,自己再顶[:)]
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
帖子沉太快,不得不顶了[:D]
 
I

icc

Unregistered / Unconfirmed
GUEST, unregistred user!
你的问题分析的不到家呀
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
to icc:
问题也许没有描叙的很清楚,可能是表达能力有限吧。
如上举例:25个整型数组,分7段,s1-s7,则每段包含的元素个数分别为s1=4,s2=4,s3=4,s4=4,s5=3,s6=3,s7=3,则第一个可能的分段组合为:
1 2 3 4,5 6 7 8,9 10 11 12,13 14 15 16,17 18 19,20 21 22,23 24 25。
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
看来高手们都不屑于解答这样的小case了,郁闷~~~[:(]
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
好像和这个帖子的问题有相似的地方:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=968511
将帖子中的颜色数改为25,箱子数改为7,盒子内最多、最少球数分别设置为4,3,即为所
求。不过帖子只是给出了具体的组合,没有给出一个行之有效的计算总数的公式... :(
 
A

AI_Player

Unregistered / Unconfirmed
GUEST, unregistred user!
除去每个盒子都有的3个小球,这题实际上是7个盒子,4个小球,每个盒子最多放1个小球,一共多少种放法
用组合公式就是C(7,4) = C(7,3) = (7*6*5)/(3*2*1) = 35种
 
A

ANiDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
问题也许没有描叙的很清楚,可能是表达能力有限吧。
如上举例:25个整型数组,分7段,s1-s7,则每段包含的元素个数分别为s1=4,s2=4,s3=4,s4=4,s5=3,s6=3,s7=3,则第一个可能的分段组合为:
1 2 3 4,5 6 7 8,9 10 11 12,13 14 15 16,17 18 19,20 21 22,23 24 25。
这个问题应该是这25个数的所有排列组合了, 1+2+3+...+24+1=301;
string也可以看作是Char的数组,先用string简单点来试下
function GetLists(Strs: TStrings): Integer;
procedure Exchange(var S: string;
const Idx1, Idx2: Integer);
var
C: Char;
begin
C := S[Idx1];
S[Idx1] := S[Idx2];
S[Idx2] := C;
end;

var
S: string;
I, J: Integer;
begin
S := 'abcdefghijklmnopqrstuvwxy';
Strs.Clear;
Strs.begin
Update;
try
Strs.Add(S);
for I := 1 to Length(S)do
for J := I + 1 to Length(S)do
begin
Exchange(S, I, J);
Strs.Add(S);
//S := 'abcdefghijklmnopqrstuvwxy';
end;
finally
Strs.EndUpdate;
end;
Result := Strs.Count;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Caption := IntToStr(GetLists(Memo1.Lines));
end;
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
昨天 AI_Player 兄在MSN上讨论这个问题时中给出了组内元素不必为相邻值(也
就是说,1和25可能被分配到同一组中)时的25分7组的解:
C(25,4)*C(21,4)*C(17,4)*C(13,4)/4! * C(9,3)*C(6,3)*C(3,3)/3!
注:两个除法用于消除数量相同的几组之间的顺序差别。
不过,看起来楼主的问题没有这么复杂,应该还是保证数组顺序不打乱的前提下的分段。
也就是简单的C(7,4)问题。
 
P

peerson

Unregistered / Unconfirmed
GUEST, unregistred user!
感谢大家的帮助,creation-zy 和AI_Player 兄讨论的方法与需求比较符合。
to creation-zy兄:问题确实如您所想的复杂,数据的顺序是会被打乱的,如果有时间,有劳给段代码学习一下,谢谢!
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
如果真的可以打乱,那么用我在 www.delphibbs.com/delphibbs/dispq.asp?lid=968511
所给出的代码就可以求解了(颜色25,每种颜色一个,7个箱子,每个箱子最多4个,最少3
个),只不过,总的组合数公式AI_Player兄已经给出了,我没有细算,但初步估计下来也
在 10^14 以上(即以百万亿计算)。
 

Similar threads

S
回复
0
查看
945
SUNSTONE的Delphi笔记
S
S
回复
0
查看
766
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
742
DelphiTeacher的专栏
D
顶部