我遇到了这个问题:
鞋匠有N个工作(来自客户的订单)来执行。
鞋匠每天只能从事一项工作。对于每个工作我,T [i] (1≤T[i]≤1000)是鞋匠完成鞋子所需的时间 工作。对于在开始工作之前的每一天延迟,我 鞋匠必须支付罚款S [i]美分(1≤S[i]≤10000)。你的任务是 帮助鞋匠找到总数最少的工作顺序 细
解决方案只是说:
按S [i] / T [i]排序。不要使用浮动!
有人可以详细说明解决方案吗?我得到的是我们必须先做低T和高S的工作,然后我会看到一些输入如何工作,但有人可能会证明S [i] / T [i]的排序在一般情况下有效吗?
答案 0 :(得分:2)
证据看起来像这样:让我们假设工作的顺序是以某种方式固定的。我们来看看两个相邻的工作。如果我们交换它们,那么在这两个之前和之后的工作的答案不会改变。因此,我们可以忽略所有其他工作,看看如果我们将这两个工作交换,就好像没有其他工作一样。如果他们没有交换,则罚款为f1 = s1 * t1 + (t1 + t2) * s2
。如果它们被交换,则为f2 = s2 * t2 + s1 * (t1 + t2)
。在最佳答案f1 <= f2
中,这意味着s2 * t1 <= s1 * t2
或s1 / t1 >= s2 / t2
。该比较器具有传递性,因此最佳的局部排序可提供最佳的全局答案。
答案 1 :(得分:0)
通过矛盾假设存在一个最优的排序并且它不是由S [i] / T [i]排序的。 =&GT;它存在一些工作i和j,使得S [i] / T [i]> S [j] / T [j]和j在i之前执行。
考虑如何通过切换i和j的顺序来改变总罚款,这与最初的这种排序是最优的假设相矛盾。
这还不够,还是需要我完成论证/详细说明?