Fractional Knapsack
What is the primary objective of this algorithm? What does the ratio represent for each item? Why does the algorithm allow taking fractions of items?
Knapsack Problem
You have a knapsack with a weight limit, and you want to maximize the value of the items you can fit into the knapsack without exceeding its weight capacity.
Example:
A (8kg, 40$)
B (5kg, 30$)
C (3kg, 20$)
D (2kg, 15$)
Knapsack Capacity: 12
Solution:
(D) 2kg, 15$ + (C) 3kg, 6.6$ + (B) 5kg, 6$ + (A) 2kg, 5$ = 12kg, 75$
Fractions
The solution should maximize the total value while respecting the knapsack's weight limit. In the fractional knapsack problem, fractions can be real numbers. 1. Calculate value-to-weight ratio for each item. 2. Sort items by ratio in descending order. 3. Start filling the knapsack until the weight limit.
from icecream import ic
def calculate_ratio(item):
name, weight, price = item
return price / weight
def fill_knapsack(items, capacity):
# Sort desc by ratio
sorted_items = sorted(items, key=calculate_ratio, reverse=True)
ic(sorted_items)
# Fill the knapsack until limit is reached
sack_items = []
total_weight = 0
total_price = 0
for item in sorted_items:
n, w, p = item
if total_weight + w <= capacity:
sack_items.append((n, w, calculate_ratio(item)))
total_weight += w
total_price += p
else:
fraction = (capacity - total_weight) / w
sack_items.append((n, int(fraction * w), calculate_ratio(item)))
total_weight += fraction * w
total_price += fraction * p
break
return total_price, total_weight, sack_items
# Items list
items = [
('A', 8, 40),
('B', 5, 30),
('C', 3, 20),
('D', 2, 15)]
# Knapsack capacity
capacity = 12
total_price, total_weight, sack_items = fill_knapsack(items, capacity)
ic(total_price, total_weight, sack_items);
"""
ic| sorted_items: [('D', 2, 15), ('C', 3, 20), ('B', 5, 30), ('A', 8, 40)]
ic| total_price: 75.0
total_weight: 12.0
sack_items: [('D', 2, 7.5), ('C', 3, 6.66), ('B', 5, 6.0), ('A', 2, 5.0)]
"""
Last update: 339 days ago