Решение задачи о рюкзаке таблицей: n предметов, вместимость рюкзака W (целое число). Определите время выполнения.
Размер таблицы рюкзака
Код
def knapsack(weights: list[int], values: list[int], capacity: int) -> int:
n = len(weights)
table = [[0] * (capacity + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(capacity + 1):
table[i][w] = table[i - 1][w]
if weights[i - 1] <= w:
table[i][w] = max(table[i][w], table[i - 1][w - weights[i - 1]] + values[i - 1])
return table[n][capacity]Какое время выполнения?
Ответ: O(n · W)
В таблице n + 1 строк (предметы) и W + 1 столбцов (вместимость от 0 до W). Каждая ячейка заполняется за O(1): максимум из двух уже посчитанных значений. Итого O(n · W) — вместо O(2ⁿ) при переборе всех наборов. Время зависит от величины W, а не только от числа предметов, поэтому при огромной вместимости таблица тоже становится огромной.
- Подсказка 1
Сколько в таблице строк и сколько столбцов?
- Подсказка 2
Сколько работы уходит на заполнение одной ячейки?