Menu
CoddyTech

0/1 Knapsack Problem

בינוניתכנון דינמיpython iconjava iconcpp iconc iconjs icon+10

יש לך 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