297
правок
Изменения
Нет описания правки
3. Метод динамического программирование. Сложность - <tex>O(k \times W)</tex>. Рассмотрим этот алгоритм подробнее.
'''Алгоритм <tex>O(k \times W)</tex>'''
Пусть <tex>A(s, n)</tex> есть максимальная стоимости предметов, которые можно уложить в рюкзак вместимости n, если можно использовать только первые s предметов из заданных k.
Сначала генерируем <tex>А</tex>
for (i = 0; i <= W; ++i):
A[0][i] = 0
for (i = 0; i <= k; ++i):
A[i][0] = 0 {Первые элементы приравниваем 0}
for (s = 1; s <= k; ++s): for (n = 0; n <= W; ++n): {Перебираем для каждого s, все n}
if n >= w[s] {Если текущий предмет можно положить в рюкзак}
Затем найдем набор <tex>ans</tex> предметов, входящих в рюкзак, рекурсивной функцией:
void findAns(int s, int n)
if A[s][n] == 0
if A[s-1][n] == A[s][n]
== Пример ==