VOOZH about

URL: https://www.geeksforgeeks.org/cpp/c-program-for-the-fractional-knapsack-problem/

⇱ C++ Program for the Fractional Knapsack Problem - GeeksforGeeks


  • Courses
  • Tutorials
  • Interview Prep

C++ Program for the Fractional Knapsack Problem

Last Updated : 15 Jul, 2025
Pre-requisite: Fractional Knapsack Problem

Given two arrays weight[] and profit[] the weights and profit of N items, we need to put these items in a knapsack of capacity W to get the maximum total value in the knapsack.
Note: Unlike 0/1 knapsack, you are allowed to break the item.

Examples:

Input: weight[] = {10, 20, 30}, profit[] = {60, 100, 120}, N= 50 Output: Maximum profit earned = 240 Explanation: 
Decreasing p/w ratio[] = {6, 5, 4} Taking up the weight values 10, 20, (2 / 3) * 30 
Profit = 60 + 100 + 120 * (2 / 3) = 240

Input: weight[] = {10, 40, 20, 24}, profit[] = {100, 280, 120, 120}, N = 60 Output: Maximum profit earned = 440 Explanation: 
Decreasing p/w ratio[] = {10, 7, 6, 5} Taking up the weight values 10, 40, (1 / 2) * 120 
Profit = 100 + 280 + (1 / 2) * 120 = 440

Method 1 - without using STL: The idea is to use Greedy Approach. Below are the steps:

  1.  Find the ratio value/weight for each item and sort the item on the basis of this ratio.
  2. Choose the item with the highest ratio and add them until we can’t add the next item as a whole.
  3. In the end, add the next item as much as we can.
  4. Print the maximum profit after the above steps.

Below is the implementation of the above approach:
 

Output:
Maximum profit earned = 440

Time Complexity: O(N*log2N)
Auxiliary Space: O(1)

Method 2 - using STL:

  1. Create a map with profit[i] / weight[i] as first and i as Second element for each element.
  2. Define a variable max_profit = 0.
  3. Traverse the map in reverse fashion:
    • Create a variable named fraction whose value is equivalent to remaining_weight / weight[i].
    • If remaining_weight is greater than or equals to zero and its value is greater than weight[i] add current profit to max_profit and reduce the remaining weight by weight[i].
    • Else if remaining weight is less than weight[i] add fraction * profit[i] to max_profit and break.
  4. Print the max_profit.

 Below is the implementation of the above approach:

Output:
Maximum profit earned is:440

Time Complexity: O(N)
Auxiliary Space: O(N)

Comment
Article Tags: