某大学大二算法试题

本题为某大学某老师发给某学生的题目,在算法群中引发讨论,讨论结果愿与诸君分享。

题目:在理想情况下(无障碍物,不考虑碰撞),4个同样类型小车(a, b, c, d)从任意位置同时出发,要分别到达4个指定的位置的车库(A, B, C, D)(一个车库只能停一辆车),假设全部小车进库的时间是T,即最后一辆小车完成入库的时间。编程求出T的最小值,并给出一种最优方案,即车和车库的对应关系。小车入库的时间如下表所示。

第一个方法,很容易想到了,就是暴力法,但是暴力法只是思路比较简单,实际上空间复杂度和时间复杂度会比较高(因此肯定不是最佳算法),这个暴力法的思路就是二维数组排列组合,复杂度非常高,在数值较低时体现的不明显(4^4),当应用于实际问题时,缺陷比较大。但是容易实现;

第二种方法,可以采用贪心算法,相对来说复杂度和实现都会好一点,先找到小车入库时间表中A列最小的值,然后取B列最小的值,如果和上一次取到的最小值在同一行,就取该列次小值,对ABCD进行上述操作。并且设置一个数组visited[],用来标记哪一行已经被选取过;

第三种方法(群友B提供,广搜剪枝)广搜剪枝有5种思路,分别是可行性剪枝、排除等效剪枝、最优性剪枝、记忆化、顺序剪枝,如果应用到这题,应该是顺序剪枝,广度优先搜索+顺序剪枝,先从根结点出发1-2-3-4,然后继续从这些结点出发2-3-4/1-3-4/1-2-4/1-2-3,不和上面重复;

第四种方法(群友T提供),弗洛伊德算法经常用于求最优解,可以去了解了解(遗传算法、模拟退火、爬山算法、粒子群算法、蚁群算法);

第五种方法(群友R、C提供),如果这个是个二分图的话,可以用二分图最大匹配,将车子和车库分别作为两列,为了寻找最大匹配,使用匈牙利算法进行寻找,不断寻找原有匹配的增广路径。但是问题在于二分图匹配是无权的,所以(应该)可以使用KM算法。

 

集思广益,得出此解,给各位做个参考,若有其他解法,也可在评论区提出。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值