这是我今天中期的一个问题,我想知道如何解决这个问题。我所知道的就是使用归纳来证明贪心算法。
问题:
您正在开发一个编程项目。有n个Java类C1,C2,...,Cn(专家架构师这样说)。架构师还说这些类必须按顺序实现(在完成C1之前不允许实现C2等等。)
每个Java类最多需要8个小时才能实现。你每天工作8小时,你不应该在一天结束时完成一个Java课程。
要尽快完成项目,策略是尽可能多地实施每天的课程。 证明这种贪婪的策略确实是最佳策略。 (提示:让我们使用上述策略在前i天完成的课程总数。如果ti不低于使用任何其他策略在前i天完成的课程总数,则策略始终保持领先)< / p>
答案 0 :(得分:0)
问题陈述不完整。没有迹象表明任何课程将花费不到8小时。既然你不能让任何课程未完成,那么你必须在一天开始时开始每节课,以确保至少有8个小时的时间来完成它。因此,如果C2真的需要3个小时而C3真的需要5个小时,那么贪婪算法将允许两个类在同一天完成。但是在C2需要3个小时之后,你必须等到第3天才能开始C3,以确保你有足够的时间来完成,因为你不知道C3需要多长时间。
所以限制真的最终要求这项工作需要 n 天,每班1天。所以实现算法是严格顺序的,而不是贪心的。
修改问题中的限制
(1)有n个Java类C1,C2,...,Cn
(2)这些类必须按顺序实现(在完成C1之前不允许实现C2等等。)
(3)每个Java类最多需要8个小时才能实现
但是没有任何课程估计花费不到8小时。
(4)你每天工作8小时
(5)你不应该在一天结束时将Java课程保留未完成。
这个(3,4,&amp; 5)的要点是让我假设我在1级上工作5分钟。我现在还剩7小时55分钟。我可以从2级开始吗?不,因为它可能需要长达8个小时,我必须在8小时工作结束前完成。所以我必须等到第2天开始上课,依此类推。因此,实施是严格按顺序进行的,需要n天才能完成,每节课1天。
要使用贪婪算法,您需要其他信息。
(6)你也知道每个类都有一个已知的小时数来编写类 - h1,h2,h3,...,hn。因此,1级需要h1小时,2级需要h2小时,依此类推。 (从第3项开始,课程不超过8小时)
答案 1 :(得分:0)
此问题类似于传统的任务调度情况,其中必须最小化系统中的等待时间。
让C1,C2,...,C n 你的预计类和 c [1], c [2] ,. .., c [n]他们所需的实施时间。假设您按此顺序实现C1,C2,... C n 。因此,每个类C k 的总时间(等待+实现)将是:
c [1] + c [2] + ... + c [ k ] < / p>
因此,我们有总时间:
T = n · c [1] +( n - 1)· c [2] + ... + 2 * c * [ n - 1] + c [ n ] = sum( k = 1到 n )( n - k + 1)· c [ķ
(对不起演示文稿 - 不支持上标,下标和数学公式......)
假设我们的排列中的实现时间没有按升序排序。因此,我们可以找到两个整数a和b,使得 a &lt; b c [ a ]&gt; C [ B'/ EM>]。如果我们在 T 的计算中切换它们,我们有:
T' =( n - a + 1)· c [ b ] +( n - b + 1)· c [ a ] + sum( ( n - k除 a , b )之外 = 1到 n + 1)· c [ k ]
我们最终计算 T - T':
T - T' =( n - a + 1)( c [ a ] - c [ b ])+( n - b + 1)( c [ b ] - c [ a ])=( b < / em> - a )( c [ a ] - c [ b ])
遵循我们的初步假设( a &lt; b 和 c [ a ]&gt; c [ b ]),我们有 b - a &gt; 0和 c [ a ] - c [ b ]&gt; 0也是如此,因此 T - T'&gt; 0
这证明我们通过切换任何一对任务来减少总等待时间,以便先完成较短的任务。
您的问题陈述是相同的,除了在开始实施新课程之前,您必须检查是否应该立即启动它(如果当天有足够的时间)或明天。但是,在最大限度地减少总“等待”时间时,这里证明的原则很有用。
答案 2 :(得分:0)
这不是SO的编程问题。问题不是要求编码解决方案,而是要求贪婪是最优的。这可以通过矛盾证明来完成(毫无疑问,在中期之前在课堂上教授)。
你想要做的是计算贪婪(只有一个解决方案)所花费的总时间,并反驳当天的任何掉期都会带来更好的解决方案。您可能还需要添加一些内容,其中提到了交换将允许您将订单置换为最佳解决方案(如果存在)。
我打算写一些公式,但我意识到Jeff Morin已经有方程式,只是朝着相反的方向前进。我认为从贪婪的解决方案开始可能更容易解释,因为“按顺序”几乎是由问题定义的,你只能转移工作+ - 它完成了哪一天。