这样叙述你看是不是<br>设,有N个班级,分为M个类别,其中每个类别包含1..X个班级,有考场教室数量R,其可以容纳学生数量为Y1..Yn。不同类别的学生(可以是不同班级的)不能坐在同一个考场教室。<br>求 座位如何安排.<br>另求 同班同类的必须座同一教室。座位如何安排.<br>解 我们假设有3个班级分别有10,20,30人,2个类别(25,35人),2个教室可以容纳30,40人(教室数量必然大于类别数量),那么必然25人到30人教室,35人到40人教室。<br>如果教室为10,12,48 人的3个教室,怎么分配?必然有两个类别的要分配到同一个教室。不满足设定条件。匹配失败。<br>看楼主的意思,可能只需要检查是否能够将每个类别人数匹配到每个教室容器,一旦容器被某类别占用,就不能再分给别的类别。<br>程序如下<br><br>type troom=record<br> kind:integer;<br> num:integer;<br> realnum:integer;<br>end;<br><br>type tstudentgroup=record<br> kind:integer;<br> num:integer;<br> blance:integer;<br>end;<br><br>r:array [0..10] of troom;<br>s :array [0..5] of tstudentgroup;<br><br>for i:= 0 to 5 do s.blance = s.num //都没坐<br><br>sort(s);//按人数排序 小->大<br>sort(r);//按可以容纳人数排序 小->大<br>j:=0;<br>for i:= 0 to 10 do<br>begin<br> if s[j].blance <= r.num then<br> begin<br> r.kind := s[j].kind;//坐完了,别的组不能再坐本教室<br> r.realnum := s[j].blance;<br> inc(j);<br> end<br> else<br> begin<br> r.kind := s[j].kind;//其他人出去<br> r[j].realnum := r[j].num;//实际坐了多少<br> s[j].blance := s[j].blance - r.num ;//余下多少人没有座位<br> end;<br>end;<br>if j < 5 then showmessage('无解');<br><br>但是这个算法 ,有点问题,就是不同类别人数 差别太大,可能不是最优的方法,比如第2类人排余下的数量可能正好教室1 可以容纳. <br><br>比如教室 10,20,30人<br>学生 1 ,21, 31 (无解)<br><br>教室10,20,40,40<br>学生1,21,41<br>10,20,1,40 无解<br><br>但实际上可以<br>10 20 40 40<br>1 1 21 40<br><br>恩,向大家学习,是否必须用穷举法呢。