Действуя в лоб, почти сразу получаем задачу о рюкзаке. Запишем задачу формально:


где

- целочисленный положительный вектор стоимостей,

- вектор решения,

-действительный вектор весов,

-граничная стоимость.
Уже видно, что это практически и есть задача о рюкзаке, дальнейшее дело техники и вкуса. Для того, чтоб ее привести к стандартной форме, можно сделать замену

. Получим:



-сумма всех стоимостей, поэтому

. Найдя решение просто делаем обратную замену. Да, и разумеется игреки должны быть не больше n это легко учесть в методе ДП.