Фон
Уявіть на мить, що у вас занудлива нудна робота. Кожного ранку вам дають збірку завдань, над якими ви повинні працювати в цей день. Кожне завдання має певну тривалість, і як тільки воно розпочнеться, воно має бути виконане за один раз. Ваш начальник не потерпить простою, тому якщо є завдання, які ви все-таки зможете виконати, перш ніж їхати додому, ви повинні попрацювати над одним із них (ви можете вибрати, яке саме). І навпаки, якщо всі інші завдання вимагатимуть вас понаднормово, ви йдете додому рано! Таким чином, ваша мета - мінімізувати тривалість робочого дня шляхом розумного планування.
Цікавий факт: це один варіант ледачих проблеми планування бюрократ , і це NP-важкою ( джерело ).
Вхідні дані
У вас є два входи: кількість "одиниць часу" у робочий день (додатне ціле число 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