What if you could carry the most valuable mix by taking just parts of items instead of whole ones?
Why Fractional Knapsack Problem in DSA C?
Imagine you have a backpack that can carry a limited weight, and you want to fill it with items to get the most value. You try to pick whole items one by one, but some items are too heavy or too valuable to skip. How do you decide what to take?
Picking items one by one without breaking them can leave a lot of unused space in your backpack. You might miss out on getting more value because you can't take part of an item. Doing this by hand is slow and often leads to poor choices.
The Fractional Knapsack Problem lets you take parts of items instead of whole items. This way, you can fill your backpack perfectly to get the highest total value. It uses a simple rule: take items with the best value per weight first, even if only partially.
int totalValue = 0; for (int i = 0; i < n; i++) { if (weight[i] <= capacity) { totalValue += value[i]; capacity -= weight[i]; } }
sortItemsByValuePerWeight(); for (int i = 0; i < n && capacity > 0; i++) { int take = (weight[i] < capacity) ? weight[i] : capacity; totalValue += take * valuePerWeight[i]; capacity -= take; }
This concept allows you to maximize the total value you carry by smartly choosing whole or parts of items based on their value-to-weight ratio.
Think about packing a lunchbox with snacks. Some snacks can be split (like nuts or candies), so you take just enough to fill the box and get the tastiest mix possible.
Manual picking wastes space and value.
Fractional Knapsack lets you take parts of items for best value.
It sorts items by value per weight and fills the capacity greedily.
Practice
Fractional Knapsack Problem?Solution
Step 1: Understand the problem goal
The fractional knapsack problem allows taking parts of items to maximize total value within a weight limit.Step 2: Compare options
Only Maximize total value by taking fractions of items within weight limit correctly describes maximizing value by taking fractions within weight limit.Final Answer:
Maximize total value by taking fractions of items within weight limit -> Option CQuick Check:
Goal = Maximize value with fractions [OK]
- Thinking only whole items can be taken
- Confusing with minimizing weight
- Ignoring value maximization
Solution
Step 1: Identify sorting requirement
Items must be sorted by value-to-weight ratio descending for greedy selection.Step 2: Match sorting method
Usingqsortwith a comparator sorting by value/weight descending is correct.Final Answer:
qsort(items, n, sizeof(Item), compare); where compare sorts by value/weight descending -> Option AQuick Check:
Sort by value/weight ratio descending [OK]
- Sorting by weight only
- Sorting without comparator
- Using inefficient sorting for large data
typedef struct { int value; int weight; } Item;
Item items[] = {{60, 10}, {100, 20}, {120, 30}};
int n = 3, W = 50;
// Assume items sorted by value/weight descending
float fractionalKnapsack(Item items[], int n, int W) {
int curWeight = 0;
float finalValue = 0.0;
for (int i = 0; i < n; i++) {
if (curWeight + items[i].weight <= W) {
curWeight += items[i].weight;
finalValue += items[i].value;
} else {
int remain = W - curWeight;
finalValue += items[i].value * ((float) remain / items[i].weight);
break;
}
}
return finalValue;
}
printf("%.2f", fractionalKnapsack(items, n, W));Solution
Step 1: Calculate value/weight ratios and sort
Ratios: 60/10=6, 100/20=5, 120/30=4. Sorted order is as given.Step 2: Add items until weight limit 50
Add first item fully: weight=10, value=60; second fully: weight=30, value=160; third partially: remain=20, value=120*(20/30)=80; total value=60+100+80=240.Final Answer:
240.00 -> Option AQuick Check:
Sum values with fractions = 240.00 [OK]
- Not sorting by ratio
- Adding partial value incorrectly
- Ignoring remaining capacity
float fractionalKnapsack(Item items[], int n, int W) {
int curWeight = 0;
float finalValue = 0.0;
for (int i = 0; i < n; i++) {
if (curWeight + items[i].weight < W) {
curWeight += items[i].weight;
finalValue += items[i].value;
} else {
int remain = W - curWeight;
finalValue += items[i].value * ((float) remain / items[i].weight);
break;
}
}
return finalValue;
}Solution
Step 1: Analyze the weight check condition
The conditioncurWeight + items[i].weight < Wexcludes items that exactly fill the knapsack.Step 2: Correct the condition
Changing to <= allows taking items that fit exactly, avoiding missing full items.Final Answer:
The condition should be <= instead of < to include full weight equal to W -> Option DQuick Check:
Use <= to include exact weight [OK]
- Using < excludes exact fit items
- Changing variable types unnecessarily
- Incorrect loop indices
Solution
Step 1: Calculate value/weight ratios and sort items
Ratios: 40/2=20, 100/20=5, 50/10=5. Sorted descending: {40,2}, {100,20}, {50,10}.Step 2: Greedy selection with capacity 26
Take {40,2} full: w=2, v=40, remain=24.
Take {100,20} full: w=22, v=140, remain=4.
Fraction of {50,10}: (4/10)*50=20, total v=160.Final Answer:
160 -> Option BQuick Check:
Max value by greedy fractions = 160 [OK]
- Ignoring sorting by ratio
- Taking items in wrong order
- Miscomputing fractional value
Ready to prove it?
Pass the test and this pattern moves unknown
