я вполне могу сделать и константный размер элементов вектора, скажем

битов, такого размера хватит для

,
Тогда можно сделать и константный размер вектора

, этого тоже хватит для

. И получим что алгоритм требует

памяти.
В массовых задачах асимптотику времени и памяти нужно считать на бесконечности.
почему ваш алгоритм работает?
Да собственно он считает по той же формуле, только немного в другом порядке. Перед выполнением очередного внутреннего шага, в
cache[j] лежит

при

и

при

. После этого шага, соответственно, в
cache[i + k] появляется

.
Ну и цикл идет не до

, а до

, т.к. остальные значения нам не нужны - добавление очередного слагаемого, не меньше

, уже даст число, большее

, которое нас не интересует.