Изменения

Перейти к: навигация, поиск

Задача о рюкзаке

28 байт добавлено, 19:58, 18 декабря 2012
Нет описания правки
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] {Если текущий предмет можно положить в рюкзак}
then A[s][n] = max(A[s-1][n], A[s-1][n-w[s]]+p[s]) {выбираем класть его или нет} else else A[s][n] = A[s-1][n] {иначе, не кладем}
Затем найдем набор <tex>ans</tex> предметов, входящих в рюкзак, рекурсивной функцией:
void findAns(int s, int n)
if A[s][n] == 0
then return
if A[s-1][n] == A[s][n]
then findAns(s-1, n) else findAns(s-1, n - w[s]); ans.push(s);
== Пример ==
297
правок

Навигация