DIGITAL GURU
Java DSA Portfolio

Activity Selection & Fractional Knapsack

Learn Greedy Choice Property, Optimal Substructure, Activity Selection, and Fractional Knapsack algorithm.

Anuj Kumar Singh Written by Anuj Kumar Singh (Lead Engineer, 13+ yrs exp) 5 min read Verified Spring Boot 3+ Guide

Formal Definition & Classification Types

Definition: A Greedy Algorithm is an algorithmic paradigm that builds up a solution piece-by-piece, always choosing the next piece that offers the most immediate, locally optimal benefit without ever rethinking past decisions.

Real-World Analogy

Fractional Knapsack is taking expensive spices from a market—you sort items by value-per-pound ($val/weight$) and fill your bag with the highest density spice first, breaking items into fractions if needed!

Greedy Algorithm Principles

Greedy algorithms make locally optimal choices at each step, hoping to find global optimum.

Production Code Example:

FractionalKnapsack.java
import java.util.*;
public class FractionalKnapsack {
    static class Item { int weight, value; Item(int w, int v) { weight = w; value = v; } }
    public double getMaxValue(Item[] items, int capacity) {
        Arrays.sort(items, (a, b) -> Double.compare((double)b.value / b.weight, (double)a.value / a.weight));
        double totalVal = 0.0;
        for (Item item : items) {
            if (capacity >= item.weight) {
                capacity -= item.weight; totalVal += item.value;
            } else {
                totalVal += item.value * ((double)capacity / item.weight); break;
            }
        }
        return totalVal;
    }
}

Key Complexity & Algorithmic Takeaways:

When implementing Activity Selection & Fractional Knapsack in coding interviews and production applications, keep these core guidelines in mind:

  • Time Complexity Analysis: Always evaluate best-case, average-case, and worst-case time complexities ($O(1)$, $O(\log n)$, $O(n)$, $O(n \log n)$, $O(n^2)$).
  • Space Complexity & Memory Bounds: Account for auxiliary memory usage, call stack frame recursion overhead, and heap allocations.
  • Edge Cases & Validation: Test empty inputs, null pointers, single-element collections, duplicate values, and integer overflow bounds.
  • Optimal vs Naive Solutions: Start with a clear brute-force solution, then optimize using techniques like Hashing, Two Pointers, Windowing, or Dynamic Programming.

Summary Takeaway:

Mastering Activity Selection & Fractional Knapsack provides the foundational problem-solving skills needed to pass technical coding interviews at top tech companies and write ultra-performant software systems.

Greedy Proof

Greedy works for Fractional Knapsack, but FAILS for 0/1 Knapsack (which requires Dynamic Programming!).