寻求解决方案的一般证据"鞋匠"

时间:2015-01-01 14:01:43

标签: algorithm

我遇到了这个问题:

  

鞋匠有N个工作(来自客户的订单)来执行。

     

鞋匠每天只能从事一项工作。对于每个工作我,T [i]   (1≤T[i]≤1000)是鞋匠完成鞋子所需的时间   工作。对于在开始工作之前的每一天延迟,我   鞋匠必须支付罚款S [i]美分(1≤S[i]≤10000)。你的任务是   帮助鞋匠找到总数最少的工作顺序   细

解决方案只是说:

  

按S [i] / T [i]排序。不要使用浮动!

有人可以详细说明解决方案吗?我得到的是我们必须先做低T和高S的工作,然后我会看到一些输入如何工作,但有人可能会证明S [i] / T [i]的排序在一般情况下有效吗?

2 个答案:

答案 0 :(得分:2)

证据看起来像这样:让我们假设工作的顺序是以某种方式固定的。我们来看看两个相邻的工作。如果我们交换它们,那么在这两个之前和之后的工作的答案不会改变。因此,我们可以忽略所有其他工作,看看如果我们将这两个工作交换,就好像没有其他工作一样。如果他们没有交换,则罚款为f1 = s1 * t1 + (t1 + t2) * s2。如果它们被交换,则为f2 = s2 * t2 + s1 * (t1 + t2)。在最佳答案f1 <= f2中,这意味着s2 * t1 <= s1 * t2s1 / t1 >= s2 / t2。该比较器具有传递性,因此最佳的局部排序可提供最佳的全局答案。

答案 1 :(得分:0)

通过矛盾假设存在一个最优的排序并且它不是由S [i] / T [i]排序的。 =&GT;它存在一些工作i和j,使得S [i] / T [i]> S [j] / T [j]和j在i之前执行。

考虑如何通过切换i和j的顺序来改变总罚款,这与最初的这种排序是最优的假设相矛盾。

这还不够,还是需要我完成论证/详细说明?