过桥问题的通解
来源:互联网 发布:mysql数据库教学视频 编辑:程序博客网 时间:2024/04/18 20:55
问题一,一个典型过桥问题:
小明一家5口人在夜晚过一座桥,小明过桥要1分钟,小明的弟弟过桥要3分钟,小明的爸爸过桥要6分钟,小明的妈妈过桥要8分钟,小明的爷爷过桥要12分钟;这座桥每次只能过2个人,因是夜晚,过桥时必须提着灯,小明有一只灯,点燃后30分钟会熄灭,问怎么样安排,才能保证小明一家在灯熄灭前过桥。
答案:
小明和弟弟过去,小明回来,4分钟
妈妈和爷爷过去,弟弟回来,15分钟
爸爸和小明过去,小明回来,7分钟
小明和弟弟过桥,3分钟
合计4+15+7+3=29分钟
问题二:如果有n个人过桥,一次只能过2个人,过桥必须提着灯,并且只有一只灯(这里不会熄灭);求过桥所要的最少时间是?
现在我们把2(n>2)个人过桥的过程称为“过桥”,1个人提灯回来叫做“送灯”。
为了使整个过程耗时最少,那么就要尽量做到两点。一是送灯是1个人完成。那么这个人一定要最快。
二是过桥是2个人,因为是取两者耗时最多的,那么另一个人被吃掉的时间要尽量大。
如果两点能同时做到,那这样得到的耗时很有可能(未经证明不敢说一定)是最小的。
当n=1、2时,只有一次过桥,耗时为一固定值。
当n=3时,记3人分别为,,。这里耗时<=<=,
最佳方案为 操作 状态 耗时 过桥 ---- 送灯 ---- 过桥 ---- 总耗时 ++
当n=4时,记4人耗时分别为,,,。这里耗时<=<=<=,
第一种方案,送灯要最快方案为 操作 状态 耗时 过桥 ---- 送灯 ---- 过桥 ---- 送灯 ---- 过桥 ---- 总耗时 2+++第二种,要吃掉时间最长方案为 操作 状态 耗时 过桥 ---- 送灯 ---- 过桥 ---- 送灯 ---- 过桥 ---- 总耗时 +3+
两种方案耗时差为(2+++)-(+3+)=+-2,所以当+>2时方案二更优,当+=2时方案一、二结果一样,当+<时方案一更优。可以列举其他方案,可以得出方案一二里必有一个为最优方案。当n>4时,记n个人耗时为,,.....,,切依次不严格递增。很自然的可以想到最大耗时的几个人应该只进行一次过河。由n=4时可以知道送灯时间最短和被吃掉时间最长,并不能同时做到。但整个过程中,即使为了每次过桥尽可能吃掉一个最长的时间,也只需要2个不同的人送灯就可以做到,那么应该尽量选择和。这里假设过河方案为每次由、、和将最大的和送过河,直到n<=4。考虑到使被吃掉时间最长,应该和一起过河。那么和的过河方案为 操作 状态 耗时 ,过桥 (),, --- , 送灯 (),,, --- ,过桥 (), --- ,, 送灯 ,..., --- , 总耗时 +2+ 如果不和一起过河,那么这里只利用送灯,使和过河。 操作 状态 耗时 ,过桥 (),, --- , 送灯 (),,, --- ,过桥 (), --- ,, 送灯 ,..., --- , 总耗时 2++ 在这两种方案下,过河规模减少了2(少了,),同样当2<+时,和同时过河更优;当2=+时,两种方案耗时相同;当2>+时,和不一起过河更优。那么现在过桥方案为,当n>4时,每次最先将耗时最长的两个人送过河,如果2<=+,选择和同时过河,如果2>+,选择、分别和过河;直到n<=4为止,当n<=4时最优结果已经讨论得出。假设为上述方案的耗时函数,这里可以看出和过河代价为-。也即=+-(n>4);那么在这个方案下,过桥问题耗时的解记为:n=1时,=n=2时,n=3时,n=4时,n>4且n为奇数时,n>4且n为偶数时,三、那么是否为过桥问题的最优解呢?接下来就对其进行证明。首先当n>2时(n=1和2是可以单独讨论),每次过桥和送灯后,过桥人数减一,最后一次不需要人回来送灯,所以有过桥次数为n-1次,送灯次数为n-2次;设和,耗时为人的过桥和送灯次数,显然有,且,。设函数对应送灯的总时间,设函数表示取,最大值,设函数(其实就是在个(),最优的选择(),使得对所有的对取最大值的和最小)对应过桥的总时间。记,现在求最小值。这里先讨论的关系,首先有约束条件为,。对于函数,由于,,所以在序列中,为了取值尽量小,那么使越是前面的取值要尽可能大,当时,有。对于函数,(i<j),假设>,此时记为,则在中至少存在着-个,显然有,故有将中-个换成-个使得。所以一个序列,满足对(i<j)有,使得函数取得最小值。同时对, ,必有或,使得,也即当,取最小值时,即,函数可以取得最小值。综上,对于满足约束条件,时。,当取得最小值时,也是的最小值。在上述条件下,接下来讨论,怎么分配能取到最小值。对于函数同上。对于函数,设所有个,个和每1个 相互匹配求最大值和的所有可能值的集合为,这里有,假设不与匹配求最大值,而与匹配,那么至少有个不与匹配求最大值,任取一个,显然有(,,只出现一次)。那么有,也就有当所有的与匹配求最大值时,可以在集合中取到更小的值。若与匹配后,还有多余的,则在剩下的个和每1个 中,如果,则,由于要两两不同匹配,剩下的个和每1个 (正好个)一一匹配。如果,当所有的分别与一一匹配求最大值时,能在集合中取到更小的值。否则必有 与匹配求最大值, 与 匹配求最大值,而。所以当所有与匹配后剩下的分别与匹配求最大值时,可以在集合中取到更小的值。对于剩下的(个)(不严格递增),显然是依次相连的两两匹配可以取得最小值。这里可以首先看和,由于对,且不等,有,所以和匹配到一起可以取得最小值,依次下去就可知道依次相连的两两匹配可以取得最小值。由于函数为集合的最小值,通过对取集合的最小值时,匹配方式的讨论,在且时,我们可以进一步得出函数的表达形式为:所以当n为奇数时,这里函数第二行项数为,第三行项数为。且随着,值的改变项数相应增减(总项数不变)。令,,现在记为的最小值。当时,有此时有当时,有此时有所以有当n为偶数时,同理。综上当n>2时有当n>2时,由定义可知必为过桥问题耗时的下界,又是过桥问题一个方案的耗时解。所以函数为过桥问题的最小耗时。当n=1,2时,同样也是过桥问题的最小耗时。
阅读全文
0 0
- 过桥问题的通解
- 关于约瑟夫环的问题 的通解
- 编程问题的O(1)通解
- 过桥问题
- 过桥问题
- 过桥问题?
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- 过桥问题
- caioj1092 并查集模板
- 注重细节
- 计蒜客 判定欧拉回路 (利用并查集实现有向图欧拉回路的判断)
- 全排列 递归方法与非递归方法实现
- POJ_1458_Common Subsequence
- 过桥问题的通解
- 描述内存分配方式以及它们的区别?
- ubuntu14.04版本MeshLab软件的安装与使用方法
- 最大公共子串问题的Python解法
- TCP的三次握手和四次挥手
- 实验楼_TCP/IP网络协议基础_Note05_S6
- CSS中可以和不可以继承的属性
- 51Nod 1135 求一个奇质数的最小原根
- 认认真真写博客,踏踏实实编代码