背景
想象一下,您从事一项令人烦恼的工作。每天早晨,您会收到一系列应该在当天进行的任务。每个任务都有一定的持续时间,一旦开始,就必须一次性完成。您的老板不会容忍闲置,因此,如果有一些任务仍然可以在回家之前完成,则必须处理其中一项(您可以选择其中一项)。相反,如果所有其他任务都需要您加班,那么您就可以早点回家!因此,您的目标是通过明智的安排来最大程度地减少工作时间。
有趣的事实:这是懒惰的官僚调度问题的一种变体,它是NP-hard(来源)。
输入值
您有两个输入:工作日中“时间单位”的数量(正整数L
)和任务集合(正整数的非空数组T
,表示任务持续时间)。它们可以以任何顺序以任何合理的格式进行使用。该数组T
可以包含持续时间大于的任务L
,但是可以保证至少包含一个持续时间最多的任务L
。
输出量
一个有效的计划是任务的一个子集S ⊆ T
,从而sum(S) ≤ L
,而不是在每一个任务S
(计重数)的持续时间严格不止L - sum(S)
。您的输出应为有效计划的最小可能总和。换句话说,您将输出您今天必须工作的最小时间单位。
例
考虑输入
L = 9
T = [3,4,4,4,2,5]
安排一天的一种方式是[4,4]
:您以8个时间为单位完成两项任务,还剩下1个单元。由于没有可用的1单元任务,因此您可以回家。但是,时间表[2,5]
甚至更好:您以7个时间单位工作,然后所有其余任务将以3个或更多时间单位工作。该时间表[2,4]
无效,因为在工作了6个时间单位后,您仍然有足够的时间来完成3个单位的任务。最佳状态为7个单位,因此正确的输出为7
。
规则和计分
您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。没有时间限制,因此蛮横强制是完全可以接受的。
测试用例
这些以格式给出L T -> output
。
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52