Menu
CoddyTech

Fractional Knapsack

У тебя есть n предметов. Предмет i стоит values[i] и весит weights[i]. Вместимость твоей сумки — не более capacity, и ты можешь взять любую часть предмета: часть предмета i весом w стоит values[i] × w / weights[i].

Напиши функцию с именем fractionalKnapsack, которая возвращает наибольшую общую стоимость, которую можно поместить в сумку, округлённую вниз до целого числа.

Функция

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

Ограничения

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

Примеры

Ввод
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
Вывод
151
Пояснение
На единицу веса предметы стоят 5, 3, 6 и 2.5. Предметы 2 и 0 помещаются целиком и дают 70, остаётся место для 27, а 27 из 30 единиц предмета 1 добавляют 81, итого 151.
challenge icon

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

Можешь найти ответ за время O(n), не сортируя все элементы?

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

Тест #1

Тест #2

Тест #3

Аргументы

values = [40, 90, 30, 50]
weights = [8, 30, 5, 20]
capacity = 40

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

151