主题:[讨论]排列组合问题-高手请进,全30分
yukangcool
[专家分:460] 发布于 2005-08-16 08:35:00
有红色球4个,黄色球3个,白色球3个,将他们排成一排,共有多少种排法?试生成所有的排法。
请各位高手指点!谢谢
回复列表 (共12个回复)
沙发
FancyMouse [专家分:13680] 发布于 2005-08-16 08:43:00
数量应该是P(10,10) / ( P(4,4)*P(3,3)*P(3,3) )
板凳
yukangcool [专家分:460] 发布于 2005-08-16 08:45:00
麻烦你把算法写出来,并做点说明撒!~~再加```
3 楼
yukangcool [专家分:460] 发布于 2005-08-16 09:05:00
大家帮帮忙啊,只要源程序就给你们30分!
4 楼
mo19880630 [专家分:420] 发布于 2005-08-16 13:14:00
[size=6]p[/size]43=4*3*2=24种
原程序不用了吧!
5 楼
jtchang [专家分:5370] 发布于 2005-08-17 23:56:00
1楼的答案应该是对的。
前几天我看到一个全排列的例子,可以参照下面的帖子:
http://www.programfan.com/blog/article.asp?id=582
其实这个帖子我只看了上面全排列的部分。(^_^)
我有个想法,所给条件有重复和无重复,是可以归并为一个程序的。
下面我刚刚编的程序,还没经过严密测试。这个程序,当所给条件无重复时,就形成了全排列,当所给条件有重复时,也不会出现重复排列。总的来说,在考验递归的功夫。如果不对告诉我啊!
R : 代表红球, Y : 代表黄球 W :代表白球。
var
s : string;
t : longint;
procedure proc(k:integer);
var
i,j,p : integer;
c : char;
begin
if k > length(s) then
begin
t := t+1;
writeln(t:10,' : ',s);
exit;
end;
for i:=k to length(s) do
begin
p := 1;
for j := i+1 to length(s) do
if s[i] = s[j] then p := 0;
if p=1 then
begin
c := s[k]; s[k] := s[i]; s[i] := c;
proc(k+1);
c := s[k]; s[k] := s[i]; s[i] := c;
end;
end;
end;
begin
s := 'RRRRYYYWWW'; t := 0;
proc(1);
end.
6 楼
口口and枕头 [专家分:1550] 发布于 2005-08-18 14:58:00
这里是不是有点问题哟~~~
begin
s := 'RRRRYYYWWW'; t := 0;
proc(1);//可以直接输入1吗?过程的数据传递要通过变量来实现吧?
end.
7 楼
jtchang [专家分:5370] 发布于 2005-08-18 15:58:00
to 6楼:当然可以直接输1。过程的数据传递不一定都要通过变量来实现。举个例子:求2的平方根可以直接用sqrt(2),而不需要用变量传。
参数如果是形参(我记得pascal书是写“形参”吧),既可用常数,也可以用变量传。仅是数值传送,调用过程时,参数在内存里是另外开辟空间的。在过程里改变参数的值,返回外部主程序,变量的值不会改变。
但如果是变参,就只能用变量传递。调用过程时传送的是地址,不开辟新空间,在过程里改变参数的值,返回外部主程序,变量的值会被改变。
例如下面的函数,不能用proc(1)来调用:
procedure proc(VAR k:integer);
8 楼
口口and枕头 [专家分:1550] 发布于 2005-08-18 16:16:00
呵呵~好的,我书上有形参实参的介绍看得太久了记不太清楚了,,,,呵呵再学习再学习~~
9 楼
闪电123 [专家分:470] 发布于 2005-08-19 20:21:00
简单的回溯。。。。。。。
懒了。。。。。。
10 楼
dieroad [专家分:80] 发布于 2005-08-20 10:30:00
4*10+3*10+3*10-(4+3+3)*2
(以上式子仅供参考)
不知对不对
应该是先算出当每个球都不同时的排列数目,在减去由于相同花色的球而表面相同的排列方法
我来回复