У меня один вопрос: сколько у вас функций и сколько часов?
Мне кажется, что исчерпывающий поиск был бы вполне уместен, если бы ни один не был слишком высоким.
Приложение динамического программирования довольно простое, сначала рассмотрим:
F1 = [0, 1, 1, 5] # ie F1[0] == 0, F1[1] == 1
F2 = [0, 2, 2, 2]
Тогда, если у меня есть 2 часа, мой лучший способ сделать это:
F1[1] + F2[1] == 3
Если у меня есть 3 часа, мне лучше:
F1[3] + F2[0] == 5
Таким образом, профиль является анархическим, учитывая количество часов, что означает, что если решение существует, оно состоит в манипулировании количеством функций.
Таким образом, мы можем ввести методы по одному:
R1 = [0, 1, 1, 5] # ie maximum achievable (for each amount) if I only have F1
R2 = [0, 2, 3, 5] # ie maximum achievable (for each amount) if I have F1 and F2
Представление новой функции занимает O(N)
время, где N
- общее количество часов (конечно, мне нужно было бы сохранить точное перераспределение ...)
Таким образом, если у вас есть M
функций, алгоритм равен O(M*N)
с точки зрения количества выполняемых функций.
Некоторые функции могут быть не тривиальными, но этот алгоритм выполняет неявное кэширование: то есть мы только один раз оцениваем данную функцию в данной точке!
Полагаю, нам было бы лучше, если бы мы могли использовать свойство increasing
, но, полагаю, я не уверен насчет специфики. Жду умного парня!
Так как это домашнее задание, я воздержусь от публикации кода. Я просто хотел бы отметить, что вы можете «сохранить» перераспределение, если ваши R
таблицы состоят из пар (score,nb)
, где nb
указывает количество часов, использованных в последнем введенном методе.