网上有这道题的描述,并且给了一组示例数据。我以示例数据作为输入,得到的输出与它给的输出不同。于是仔细解了一下。
重新在网上搜索之后,发现速度单位是km/h。要求输出单位是分。这样子的话,我的计算结果就是对的。
思路不需要改变,还是动态规划。
源码需要改变:
1. 将函数getInputData()中的distance *= 1000删除
2. 输入的速度可以是浮点数。将carinfo中的speed改为float类型,同时将getInputData中获取速度的形式化参数改为"%f"
3. 将函数outputResult的输出结果改为minTime*60
题目:
一个车队中有N辆卡车要过桥,N<1000。桥比较窄,不能并排过车,也不能超车。因此,不能调整车在车队的序号。比如将原第一辆车放在末尾。桥限重不能让所有的车同时通过。因此,必须将车队划分成多个分组。每个分组的总重量都不能超过桥的限重。前一个分组的车完全通过桥后,才能下一个分组的车通过桥。分组的移动速度由最慢的车决定。
输入:桥的长度,桥的限重;车队中的车数;每辆车的重量、行驶速度。输出:车队通过桥的最短时间。
100, 5Km10辆车,
1 40t 25m/s
2 50t 20m/s
3 50t 20m/s
4 70t 10m/s
5 12t 50m/s
6 9t 70ms
7 49t 30m/s
8 38t 25m/s
9 27t 50m/s
0 19t 70m/s
最短时间为:75s。
首先,证明这道题具有最优子结构。
第一个观点,如果m...n编号的车可以组成一个分队过桥,那么将m...n组成一个分队过桥耗时是最短的。
证明:假设编号为k的车是行驶速度最慢的为minSlowSpeed。如果是组成一个分队,那么车队过桥耗时为distance/minSlowSpeed。如果是分成多个分队,那么车队耗时是distance/minSlowSpeed+otherPackageTime>distance/minSlowSpeed。
第二个观点,如果需要将m...n编号的车组成2个分队m...k, k+1...n过桥,那么当m...k按照最小耗时分队过桥且k+1...n按照最小耗时分队过桥的情况下,m...n过桥时间最短。
得到到动态规划方程为:
if (sumOfWeight(m, n) < capacityOfWeight)
{
P(m, n) = max{P(m, m), P(m+1, m+1), ..., P(n, n)};
}
else
{
P(m, n) = min {P(m, m) + p(m+1, n), p(m, m+1)+p(m+2, n), ..., p(m, n-1)+p(n, n)};
}