Menu
CoddyTech

Fractional Knapsack

Masz n przedmiotów. Przedmiot i jest wart values[i] i waży weights[i]. Twój plecak może pomieścić łącznie najwyżej capacity jednostek wagi, a każdy przedmiot możesz zabrać w dowolnej części: kawałek przedmiotu i ważący w jest wart values[i] × w / weights[i].

Napisz funkcję o nazwie fractionalKnapsack, która zwraca największą łączną wartość, jaką może pomieścić plecak, zaokrągloną w dół do liczby całkowitej.

Funkcja

fractionalKnapsack(values: integer-array, weights: integer-array, capacity: integer) → integer
valuesinteger-array
wartość każdego przedmiotu
weightsinteger-array
waga każdego przedmiotu
capacityinteger
maksymalna waga, jaką może pomieścić torba
Zwracainteger
największa łączna wartość, która mieści się w plecaku, zaokrąglona w dół

Ograniczenia

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

Przykłady

Wejście
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
Wyjście
151
Wyjaśnienie
W przeliczeniu na jednostkę masy przedmioty są warte 5, 3, 6 i 2.5. Przedmioty 2 i 0 mieszczą się w całości, dając 70, a pozostaje miejsce na 27. Dodanie 27 z 30 jednostek przedmiotu 1 daje 81, czyli łącznie 151.
challenge icon

Pytanie dodatkowe

Czy potrafisz znaleźć odpowiedź w czasie O(n), bez sortowania wszystkich elementów?

Zresetuj kod
def fractionalKnapsack(values, weights, capacity):
    # Wpisz kod tutaj

Test #1

Test #2

Test #3

Argumenty

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

Oczekiwany wynik

151