回 帖 发 新 帖 刷新版面

主题:[讨论]谁能用PASCAL语言,帮我做一下这道题,谢谢

[b]排列列举:第一年把五件礼物发给五个孩子,第二年又把同样的五件礼物给发给这五个孩子,而每个孩子的礼品都与上年的不同,请编程找出所有的方案。(请用PASCAL语言,谢谢)[/b]

回复列表 (共20个回复)

沙发

偶也不懂啊!我是菜鸟啊1!
不过我猜可能要用到枚举和子界类型!!!
要是只算有多少种的话1就要简单些了1但是要写出每种方案的话1就要麻烦些!!
呵呵!偶也不懂啊1

板凳

用了枚举,子界类型会更明了。你觉得算有几种,有什么好的方法?谢谢。

3 楼


  排列组合吧
  套公式

4 楼

如何套啊?谢谢。

5 楼

用递归省时间.
用5重循环也行的.

6 楼

呵呵,用深度搜索做吧,其实这是一个简单的排列问题
var
s:array[1..5] of integer;{代表五个孩子}
n,p,i,t:integer;
begin
  n:=5; s[1]:=1; p:=1;
  while p>0 do {分配礼物}
    begin
      t:=0;
      for i:=1 to p-1 do
        if s[p]=s[i] then t:=1; {检测礼物有否重复}
      if t=0 then
        if p=n then
          begin
            for i:=1 to n do
              write(s[i],' ');writeln;
          end
        else 
          begin p:=p+1; s[p]:=0; end;
      while (p>0)and(s[p]=5) do p:=p-1;
      if p>0 then inc(s[p]);
    end;
end.

7 楼

谢谢拉。

8 楼


 好像是 5*4*3*2*1+4*3*2*1*1

9 楼

这是什么意思啊?我不太懂。是怎么得出来的

10 楼

var
  k:array[1..120,1..5]of integer;
  i1,i2,i3,i4,i5,j,i,l:integer;
begin
  i:=1;
  for i1:=1 to 5 do
    for i2:=1 to 5 do
      if i1<>i2 then
        for i3:=1 to 5 do
          if (i1<>i3)and(i2<>i3) then
            for i4:=1 to 5 do
               if (i1<>i4)and(i2<>i4)and(i3<>i4) then
                 for i5:=1 to 5 do
                   if (i1<>i5)and(i2<>i5)and(i3<>i5)and(i4<>i5) then
                     begin
                       k[i,1]:=i1;
                       k[i,2]:=i2;
                       k[i,3]:=i3;
                       k[i,4]:=i4;
                       k[i,5]:=i5;
                       inc(i);
                     end;
  l:=0;
  for i:=1 to 120 do
    for j:=1 to 120 do
      if (k[i,1]<>k[j,1])and(k[i,2]<>k[j,2])and(k[i,3]<>k[j,3])
         and(k[i,4]<>k[j,4])and(k[i,5]<>k[j,5]) then
      begin
        for i1:=1 to 5 do
          write(k[i,i1]:2);
        write(' ');
        for i1:=1 to 5 do
          write(k[j,i1]:2);
        writeln;
        inc(l);
      end;
  write(l);
end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册