Fractional Knapsack
Problem Statement
Given weights and values of items and a knapsack capacity, maximize value by taking fractions of items. This medium-level greedy problem is about optimization—fill your bag with the most valuable pieces!
Example
Input: values = [60, 100, 120], weights = [10, 20, 30], W = 50
Output: 240 (all of [60,10], all of [100,20], 2/3 of [120,30])
Input: values = [60, 100], weights = [10, 20], W = 25
Output: 140
Code
Java
Python
JavaScript
public class Solution { public double fractionalKnapsack(int[] values, int[] weights, int W) { int n = values.length; double[][] items = new double[n][2]; for (int i = 0; i < n; i++) { items[i][0] = values[i] / (double) weights[i]; items[i][1] = weights[i]; } Arrays.sort(items, (a, b) -> Double.compare(b[0], a[0])); double totalValue = 0; int currWeight = 0; for (int i = 0; i < n && currWeight < W; i++) { if (currWeight + items[i][1] <= W) { currWeight += items[i][1]; totalValue += items[i][0] * items[i][1]; } else { double fraction = (W - currWeight) / items[i][1]; totalValue += fraction * items[i][0] * items[i][1]; break; } } return totalValue; } }
def fractional_knapsack(values, weights, W): items = sorted([(v/w, w) for v, w in zip(values, weights)], reverse=True) total_value = 0 curr_weight = 0 for value_per_weight, weight in items: if curr_weight + weight <= W: curr_weight += weight total_value += value_per_weight * weight else: fraction = (W - curr_weight) / weight total_value += fraction * value_per_weight * weight break return total_value
function fractionalKnapsack(values, weights, W) { let items = values.map((v, i) => [v / weights[i], weights[i]]); items.sort((a, b) => b[0] - a[0]); let totalValue = 0, currWeight = 0; for (let [valuePerWeight, weight] of items) { if (currWeight + weight <= W) { currWeight += weight; totalValue += valuePerWeight * weight; } else { let fraction = (W - currWeight) / weight; totalValue += fraction * valuePerWeight * weight; break; } } return totalValue; }
Explanation
- Greedy Choice: Sort by value/weight, take highest value items first.
- Flow: Take full items or fractions to fill capacity.
- Example: [60/10,100/20,120/30] → 6,5,4; take 10, 20, 20/30 of last.
Note
Time complexity: O(n log n), Space complexity: O(n). Fractionally fantastic!