Menu
CoddyTech

Fractional Knapsack

MoyenGloutonTripython iconjava iconcpp iconc iconjs icon+10

Tu as n objets. L’objet i vaut values[i] et pèse weights[i]. Ton sac peut contenir un poids total d’au plus capacity, et tu peux prendre n’importe quelle partie d’un objet : une partie de l’objet i qui pèse w vaut values[i] × w / weights[i].

Écris une fonction nommée fractionalKnapsack qui renvoie la valeur totale maximale que le sac peut contenir, arrondie à l’entier inférieur.

Fonction

fractionalKnapsack(values: integer-array, weights: integer-array, capacity: integer) → integer
valuesinteger-array
la valeur de chaque élément
weightsinteger-array
le poids de chaque élément
capacityinteger
le poids maximal que le sac peut contenir
Renvoieinteger
la valeur totale la plus élevée qui tient dans le sac, arrondie à l’entier inférieur

Contraintes

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

Exemples

Entrée
values = [40, 90, 30, 50]weights = [8, 30, 5, 20]capacity = 40
Sortie
151
Explication
Par unité de poids, les objets valent 5, 3, 6 et 2.5. Les objets 2 et 0 sont pris en entier pour une valeur de 70, avec une capacité restante de 27 ; 27 des 30 unités de l’objet 1 ajoutent 81, soit un total de 151.
challenge icon

Pour aller plus loin

Peux-tu trouver la réponse en O(n) sans trier tous les éléments ?

Réinitialiser le code
def fractionalKnapsack(values, weights, capacity):
    # Écrivez le code ici

Test #1

Test #2

Test #3

Arguments

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

Résultat attendu

151