Я не думаю, что вам нужно динамическое программирование, просто сделайте следующее:
- Выберите столько цифр, которые стоят меньше всего, сколько вы можете себе позволить.
- Теперь у вас есть число (состоит только из 1 типа цифр).
- Замените первую цифру максимально возможной цифрой, которую вы можете себе позволить.
- Если у вас остались деньги, сделайте то же самое для второго, третьего и так далее, пока не закончатся деньги.
Почему это работает:
Учтите, что 11111
> 9999
и 91111
> 88888
, или, говоря словами, лучше всего:
- Выберите как можно больше цифр, что делается путем выбора самых дешевых цифр.
- Затем замените эти цифры слева на цифру с наибольшим значением, которое вы можете себе позволить (это всегда лучше, чем выбирать для начала несколько более дорогих цифр).
Оптимизация:
Чтобы сделать это эффективно, откажитесь от любых цифр, которые стоят больше, чем большая цифра: (потому что никогда не стоит выбирать ее вместо более дешевой цифры с большим значением)
Given:
9, 11, 1, 12, 5, 8, 9, 10, 6
Removing all those where I put an X:
X, X, 1, X, 5, X, X, X, 6
So:
1, 5, 6
Теперь вы можете просто выполнить бинарный поиск на нем (просто помните, из какой цифры произошло какое значение) (хотя только для 9 цифр бинарный поиск на самом деле не творит чудес для и без того незначительного времени выполнения).
Время работы:
O(n)
(с оптимизацией или без, так как 9 — константа)
person
Bernhard Barker
schedule
27.09.2013