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

Максимальная ценность предметов в рюкзаке ограниченной вместимости.

СигнатураO(n*W)

Задача о рюкзаке (0/1): даны предметы с весом и ценностью; нужно набрать максимальную суммарную ценность, не превысив вместимость W. Каждый предмет берётся целиком или не берётся вовсе. Решается динамическим программированием по весу.

Сложность: время O(n · W), память O(W) при оптимизации до одной строки таблицы. Это псевдополиномиальная сложность — она зависит от величины W, а не только от числа предметов.

def knapsack(weights, values, W):
    dp = [0] * (W + 1)
    for wt, val in zip(weights, values):
        for c in range(W, wt - 1, -1):
            dp[c] = max(dp[c], dp[c - wt] + val)
    return dp[W]

print(knapsack([1, 3, 4], [15, 20, 30], 4))  # 35
← Все записи: Алгоритмы и структуры данных
Поддержать проект