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