>>
|
No. 5539
Это не "обратная", а просто задача о ранце, только с чуть измененной формулировкой. Решения (методом динамического программирования, ага) есть в вики. Их нужно только чуть доработать напильником.
Например, для случая, когда можно брать несколько предметов, делаем так:
Пусть w[n] - минимальный вес ранца, стоимость которого составляет n денег. w[0] = 0. Для того, чтобы найти очередной (когда все w[0],...,w[n-1] уже найдены) w[n], рассматриваем все предметы стоимостью x <= n, вычисляем, сколько будет весить ранец, если к w[n-x] прибавить вес этого предмета, из всех полученных варинатов выбираем наименьший, записываем полученное значение в w[n]. Если предметов стоимостью меньше n не найдется, записываем в w[n] минус бесконечность.
Когда мы вычислим w[N], где N - требуемая стоимость, у нас будет два варианта - либо w[N] > 0, тогда это и есть решение, либо там будет минус бесконечность - тогда надо продолжать вычислять последующие w[n] до получения первого положительного числа.
|