云川师兄写的过桥问题正好解决了我当时看的另一道试题:
U2合唱团在17分钟内得赶到演唱会场,途中必需跨过一座桥,四个人从桥的同一端出发,你得帮助他们到达另一端,天色很暗,而他们只有一只手电筒。一次同时最多可以有两人一起过桥,而过桥的时候必须持有手电筒,所以就得有人把手电筒带来带去,来回桥两端。手电筒是不能用丢的方式来传递的。四个人的步行速度各不同,若两人同行则以较慢者的速度为准。Bono需花1分钟过桥,Edge需花2分钟过桥,Adam需花5分钟过桥,Larry需花10分钟过桥。他们要如何在17分钟内过桥呢?
把大师的代码改了之后可以推演出过桥方案,但穷举法明显不是最优的算法。
后来经过仔细思考,我找到如下算法:
1、将用时最短的两人分在桥的两端,用以来回传递手电筒。
2、用时最长的两人一起过桥,尽量少地浪费两人之间的用时差。
具体算法见附件中流程图。
这种算法不需要查找,直接模拟过桥方案,算出最短时间。在人数大量增加时仍然运行飞快。
但暂时还没有经过严格的数学证明。正在想证明的方法,同时征集证明。(目前只想到也许数学归纳法和反证法可行。)
程序源代码和流程图见附件。
[内有附件]