Menu
CoddyTech

0/1 Knapsack Problem

У вас есть n предметов. Предмет i весит weights[i] и стоит values[i]. Ваша сумка выдерживает общий вес не более capacity. Каждый предмет существует в единственном экземпляре, и вы либо кладёте его целиком, либо оставляете. Верните наибольшую общую стоимость, которую можно унести.

Функция

knapsack(weights: integer-array, values: integer-array, capacity: integer) → integer
weightsinteger-array
вес каждого элемента
valuesinteger-array
значение каждого элемента
capacityinteger
максимальный вес, который может выдержать сумка
Возвращаетinteger
наибольшая суммарная стоимость предметов, вес которых не превышает вместимость

Ограничения

  • 1 ≤ n ≤ 100, где n = weights.length = values.length
  • 1 ≤ weights[i] ≤ 1000
  • 1 ≤ values[i] ≤ 104
  • 1 ≤ capacity ≤ 1000

Примеры

Ввод
weights = [4, 2, 3, 5]values = [10, 4, 7, 12]capacity = 7
Вывод
17
Пояснение
Предметы 0 и 2 весят 4 + 3 = 7 и стоят 10 + 7 = 17. Если сначала упаковать самый ценный предмет (вес 5, ценность 12), останется место только для предмета 1, в результате получится 16.
challenge icon

Дополнительный вопрос

Предположим, вместимость может достигать 10^9, а сумма значений — не более 10^4. По чему вы бы индексировали таблицу?

Сбросить код
def knapsack(weights, values, capacity):
    # Напишите код здесь

Тест #1

Тест #2

Тест #3

Аргументы

weights = [4, 2, 3, 5]
values = [10, 4, 7, 12]
capacity = 7

Ожидаемый вывод

17