📖 Scenario: You are helping a delivery company pack valuable items into a knapsack. Each item has a weight and a value. The knapsack can carry a limited weight. You want to maximize the total value packed. You can take fractions of items if needed.
🎯 Goal: Build a program that calculates the maximum value that fits into the knapsack using the fractional knapsack approach.
📋 What You'll Learn
Create a vector of pairs called items where each pair holds value and weight of an item
Create a variable called capacity to store the maximum weight the knapsack can carry
Sort the items vector based on value-to-weight ratio in descending order
Calculate the maximum total value that fits into the knapsack using fractional parts of items
Print the maximum total value with two decimal places
💡 Why This Matters
🌍 Real World
This problem models packing goods efficiently in limited space, like loading trucks or shipping containers.
💼 Career
Understanding greedy algorithms and optimization problems is useful for software roles in logistics, supply chain, and resource management.
Progress0 / 4 steps
1
Create the items vector
Create a vector of pairs called items with these exact entries: {60, 10}, {100, 20}, {120, 30}. Each pair represents {value, weight}.
DSA C++
Hint
Use vector> items = {{60, 10}, {100, 20}, {120, 30}}; to create the items vector.
2
Set the knapsack capacity
Create an integer variable called capacity and set it to 50.
DSA C++
Hint
Write int capacity = 50; to set the knapsack capacity.
3
Sort items by value-to-weight ratio
Include #include <algorithm> at the top. Then, sort the items vector in descending order based on the value-to-weight ratio using a lambda function.
DSA C++
Hint
Use sort with a lambda comparing a.first / a.second and b.first / b.second.
4
Calculate and print maximum value
Write code to calculate the maximum total value that fits into the knapsack using fractional parts of items. Use a double variable called totalValue initialized to 0.0. Iterate over items and add full or fractional values until capacity is zero. Finally, print totalValue with two decimal places using cout.
DSA C++
Hint
Use a loop to add full items if capacity allows, else add fractional value. Use cout << fixed << setprecision(2) << totalValue << endl; to print.
Practice
(1/5)
1. What is the main goal of the Fractional Knapsack Problem?
easy
A. Maximize total value by taking fractions of items within weight limit
B. Maximize total value by taking whole items only
C. Minimize total weight of items selected
D. Find the minimum number of items to fill the knapsack
Solution
Step 1: Understand problem goal
The fractional knapsack problem allows taking parts of items to maximize value within a weight limit.
Step 2: Compare options
Maximize total value by taking fractions of items within weight limit correctly states maximizing value by fractions; others are about whole items or minimizing weight, which are incorrect.
Final Answer:
Maximize total value by taking fractions of items within weight limit -> Option A
Quick Check:
Fractional knapsack = maximize value with fractions [OK]
Hint: Fractional knapsack allows partial items for max value [OK]
Common Mistakes:
Confusing fractional knapsack with 0/1 knapsack
Thinking only whole items can be taken
Assuming problem minimizes weight
2. Which of the following C++ code snippets correctly sorts items by value-to-weight ratio in descending order for fractional knapsack?
easy
A. std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return a.weight > b.weight; });
B. std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return (a.value / a.weight) > (b.value / b.weight); });
C. std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return a.value < b.value; });
D. std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return (a.weight / a.value) > (b.weight / b.value); });
Solution
Step 1: Identify correct sorting criteria
We must sort by value-to-weight ratio descending: (value/weight) high to low.
Step 2: Check each option
std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return (a.value / a.weight) > (b.value / b.weight); }); sorts by (value/weight) descending correctly. Others sort by wrong ratio or by value or weight alone.
Final Answer:
std::sort(items.begin(), items.end(), [](auto &a, auto &b) { return (a.value / a.weight) > (b.value / b.weight); }); -> Option B
Take first item fully: capacity=50-10=40, totalValue=60.
Take second item fully: capacity=40-20=20, totalValue=60+100=160.
Take third item fraction: fraction=20/30=2/3, value=120*(2/3)=80.
Total value=160+80=240.
Final Answer:
240 -> Option D
Quick Check:
Sum values with fractions = 240 [OK]
Hint: Pick full items then fraction of next to fill capacity [OK]
Common Mistakes:
Not sorting items by value/weight ratio
Taking items in wrong order
Incorrect fraction calculation
4. Identify the bug in this fractional knapsack code snippet:
A. Should use <= instead of < in if condition to include full item when equal
B. Sorting comparator divides integers causing integer division error
C. Capacity variable should be float, not int
D. Missing return statement at end of function
Solution
Step 1: Analyze if condition for full item inclusion
The condition uses 'item.weight < capacity', so if weight equals capacity, it skips full inclusion and takes fraction.
Step 2: Correct condition to include full item when weight equals capacity
Changing to 'item.weight <= capacity' allows taking full item if it fits exactly, which is correct behavior.
Final Answer:
Should use <= instead of < in if condition to include full item when equal -> Option A
Quick Check:
Use <= to include full item when weight equals capacity [OK]
Hint: Use <= to include full item when weight equals capacity [OK]
Common Mistakes:
Using < instead of <= causing partial fraction unnecessarily
Ignoring integer division in comparator (not an issue here)
Wrong variable types for capacity
5. Given items with values and weights: {value: 40, weight: 2}, {value: 100, weight: 20}, {value: 50, weight: 10}, and knapsack capacity 25, what is the maximum value achievable using fractional knapsack?
hard
A. 160
B. 150
C. 155
D. 140
Solution
Step 1: Calculate value/weight ratios and sort items
Ratios:
- 40/2 = 20
- 100/20 = 5
- 50/10 = 5
Sorted order: {40,2}, {100,20}, {50,10} (40,2 first due to highest ratio)
Step 2: Pick items greedily until capacity 25
Take first item fully: capacity=25-2=23, totalValue=40.
Take second item fully: capacity=23-20=3, totalValue=40+100=140.
Take third item fraction: fraction=3/10=0.3, value=50*0.3=15.
Total value=140+15=155.
Step 3: Re-check sorting for tie in ratio
Since second and third items have same ratio, order can be swapped.
Try picking {40,2}, {50,10}, {100,20}:
Take {40,2}: capacity=23, value=40
Take {50,10}: capacity=13, value=90
Take fraction of {100,20}: fraction=13/20=0.65, value=100*0.65=65
Total=40+50+65=155 (same)
Final Answer:
155 -> Option C
Quick Check:
Pick highest ratio items fully, fraction last = 155 [OK]
Hint: Sort by ratio, pick full items, fraction last to fill capacity [OK]
Common Mistakes:
Not sorting by value/weight ratio correctly
Picking items in wrong order
Ignoring fractional part calculation
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.