一个算法问题,200分求解(200分)

  • 主题发起人 主题发起人 zjwjw
  • 开始时间 开始时间
Z

zjwjw

Unregistered / Unconfirmed
GUEST, unregistred user!
1、A1+A2+A3+A4+...+A(n-1)+An = b1+b2+b3+b4+b5+10<br>(说明:左边相加的式子略大于b1+b2+b3+b4+b5)<br>2、<br>A1+...+A(n-5)&gt;=b1<br>A3+...+A(n-3)&gt;=b2<br>A4+...+A(n-4)&gt;=b3<br>A5+...+A(n-6)&gt;=b4<br>A6+...+An&gt;=b5<br>3、在2中的所有式子里,左边所有式子相加正好等于1中左边的式子相加,并且不会重复<br><br>求得出2中左边相加的式子最优组合的算法
 
//左边所有式子相加正好等于1中左边的式子相加<br>这样相加明显是不相等的
 
1、A1+A2+A3+A4+...+A(n-1)+An = b1+b2+b3+b4+b5+10<br>(说明:左边相加的式子略大于b1+b2+b3+b4+b5)<br>2、<br>A1+...+A(n-5)&gt;=b1<br>A3+...+A(n-3)&gt;=b2<br>A4+...+A(n-4)&gt;=b3<br>A5+...+A(n-6)&gt;=b4<br>A6+...+An&gt;=b5<br>3、在2中的所有式子里,左边所有式子相加正好等于1中左边的式子相加,并且不会重复<br><br>求得出2中左边相加的式子最优组合的算法<br><br>----<br>分析<br>1. 必然n &gt;=7 否则 n-6 = 0 ,没有A0<br><br>设 n=7 ,那么公式是<br>a1 + a2 + a3 + a4 + a5 + a6 + a7 = b1 + b2 + b3 + b4 + b5 + 10 ;//是否固定的 常数10 ??<br>a1 ..+ a2 &gt;= b1;<br>a3 ..+ a4 &gt;= b2;<br>a4 ..+ a3 &gt;= b3;<br>a5 ..+ a1 &gt;= b4; //这里可能不符合 数学公式,如果允许倒装还可以,否则 n 必须&gt;= 11<br>a6 ..+ a7 &gt;= b5;<br><br>2.设n = 11<br><br>n - 3 -3 + 1 &nbsp; &nbsp; &nbsp; &nbsp; 6<br>n- &nbsp;4 - 4 &nbsp;+1 &nbsp; &nbsp; &nbsp; &nbsp;4<br>n - 6 - 5 +1 &nbsp; &nbsp; &nbsp; &nbsp; 1<br>n - 3- 6 +1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;3<br><br><br>共14个单元必然是重复的,非重复单元是 a1,a2 ,an,a(n-1)<br><br>看起来的确不可能 相等,简化一下<br><br>比如有 3个数据单元 &nbsp;a,b,c<br>a + b + c<br><br>和<br><br>a + b + c + b <br><br>可能相等吗?<br><br>再简化就是<br><br>b= b + b ???<br><br>问题没有搞对
 
我只是举一个例子<br>左边的式子不一定就是A(n-2)、A(n-3)<br>只是这样表达。<br><br>说说我的具体实际问题吧:<br>我是写一个 考试考场安排 的程序<br>有N个考场,这些考场里面,从第一个考场到第n个考场最多可以坐A1、A2、....An个人<br>现在我把参加考试的高一分成五个组:高一理科重点班b1、高一理科普通班b2、高一文科重点班b3、高一文科普通班b4、高一艺术班b5,每组不能和其它组搭配坐到一起,但是这五个组的学生必须安排到那n个考场里面去。n个考场可坐人数之和稍微大于高一参考的人数(这里表达为10),n肯定是大于20的<br>怎么样安排,才能使考场的坐位坐得比较合适?
 
一起400分
 
比较直接的思维方法:<br>1. 在A1..An中求一个组合之和, 使之&gt;= B1, 且余量最小, 同理处理B2...Bm; &nbsp;得m个最小余量, 取余量最小的一个, 则解决一个Bx的问题;<br>2. 去掉1中完成的A组合与B, 再重复1的过程, 到处理完所有的B为止;
 
规则表达不确切:<br>“每组不能和其它组搭配坐到一起,”?<br><br>我觉得看你描述事件 大家来一起解决问题还容易点,看你的数学表达式觉得有点乱。<br><br>整个事件里面,A1...An,B1..B5都是定值,你现在想求什么?<br><br>(我对事件的理解是 你是不是想求 B1..B5的子集:b11...b1n,b21..b2n,.....b51..b5n 即对于每个试场各个班所需要分配的人数组成作优化。)<br><br>能对分配的规则作进一步的描述吗?
 
哦,稍微有点明白楼主的意思,是怕发试卷比较难发,所以,同个试室只能是同班的人?<br><br>那如果这种情况怎么办:b1=51,所有的a都是25,那么是不是b1要分配到3间试室,<br><br>比较笨的分法就是 25+25+1,<br>比较聪明的就是 17+17+17<br><br>难道楼主要求第二种情况的表达式 ? 是不是这样?<br>(其实也许不难,倒是没确定楼主的目的)
 
这样叙述你看是不是<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>&nbsp; &nbsp;kind:integer;<br>&nbsp; &nbsp;num:integer;<br>&nbsp; &nbsp;realnum:integer;<br>end;<br><br>type tstudentgroup=record<br>&nbsp; &nbsp;kind:integer;<br>&nbsp; &nbsp;num:integer;<br>&nbsp; &nbsp;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);//按人数排序 &nbsp;小-&gt;大<br>sort(r);//按可以容纳人数排序 小-&gt;大<br>j:=0;<br>for i:= 0 to 10 do<br>begin<br>&nbsp; &nbsp;if s[j].blance &lt;= r.num then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;r.kind := s[j].kind;//坐完了,别的组不能再坐本教室<br>&nbsp; &nbsp; &nbsp;r.realnum := s[j].blance;<br>&nbsp; &nbsp; &nbsp;inc(j);<br>&nbsp; &nbsp;end<br>&nbsp; &nbsp;else<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp;r.kind := s[j].kind;//其他人出去<br>&nbsp; &nbsp; &nbsp;r[j].realnum := r[j].num;//实际坐了多少<br>&nbsp; &nbsp; &nbsp;s[j].blance := s[j].blance - r.num ;//余下多少人没有座位<br>&nbsp; &nbsp;end;<br>end;<br>if j &lt; 5 then showmessage('无解');<br><br>但是这个算法 ,有点问题,就是不同类别人数 差别太大,可能不是最优的方法,比如第2类人排余下的数量可能正好教室1 可以容纳. &nbsp;<br><br>比如教室 10,20,30人<br>学生 &nbsp; &nbsp; 1 ,21, 31 (无解)<br><br>教室10,20,40,40<br>学生1,21,41<br>10,20,1,40 &nbsp; 无解<br><br>但实际上可以<br>10 20 40 40<br>1 &nbsp;1 &nbsp;21 40<br><br>恩,向大家学习,是否必须用穷举法呢。
 
新世纪的思路可行,不过比较复杂,穷举起来要循环很多次的<br>bsense的解法稍稍有点问题,因为各个类别的人数是差距比较大的,特别是高一艺术班这个组人数很少,有时候比一个考场的人数还要少<br><br>可能我开始没有表达好,有些朋友没有读懂,现在修改了一下在一楼<br><br>二人都有分,期待有更好的解法
 
请 新世纪,bsense到<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3888347<br>回复领分
 
楼主太客气了<br>楼主可以换个思路考虑问题:<br>1. 你的问题不是实时特别强的事情, 一年也可能就要运算3,4次;<br>2. 现在的计算机的速度已经很快了, 能够应付类似并不太复杂的重复计算;<br>3. 能解决问题就可以了, 不必强求计算速度; // 估计几分钟也就能算出100个班级,几十个考场了;
 
你的意思是每个考场至少的一个人
 
看看我写的<br><br><br>end;//
 
新世纪在另一个帖子中领分
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
539
import
I
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部