Unbounded fractional knapsack problem in Java

In this tutorial, I will show how to solve the problem of unbounded fractional knapsack problem in Java language. It is somewhat different from the conventional knapsack problem. There can be repetition of items with highest priority in this knapsack problem. We will see this further with the help of an example. So let us get started.

Unbounded Fractional Knapsack with repetition of items

As stated earlier, this algorithm is slightly different from the conventional knapsack problem. In the conventional knapsack problem, we are not allowed the repetition of items. Consequently, one item can be used only once. If there are space limitations, then a part of some item (in fractional knapsack). However, in unbounded fractional knapsack, you can choose the same item again and again. There can be repetition of items with highest priority. Moreover, since it is a fractional case, we can at last go for fraction of the most prioritized item when there are space limitations.

Let us try to understand this with the help of an example:

value[]   = [140, 225, 80, 240, 120]

weight[] =[10,  15, 10, 20, 12]

Capacity = 50kg

Output: 750

Approach for repetition of items

I will be using the OOPS concept of Java to implement this approach. I have a void output() function that takes 3 parameters. In this function, I will first of all obtain the value to weight ratio for each item. I then sorted this ratio in descending order so as to give priority to the item with highest ratio.

After that I have calculated how many times, the item with highest ratio, can be chosen completely. I put the value and weight those many times just by simply multiplying and storing in separate variables. Now we will check the space left in our bag. We will find out what part is it of the whole item and just multiply this ratio by its corresponding value. As a result, we will get the value for this part by unitary method.

In the main function, we will carry out our input and object creation. First, we need to make instance of our Scanner class so as to be able to take input. Once our initialization is done, I will make object of our class and call our output() function.

The code is shown below:

import java.util.*;
public class unbounded_knapsack 
{
    public void output(int value[], int weight[], int W)
    {
        int i;
        int t = value.length;
        System.out.println("Length: " + t);
        double ratio[] = new double[t];
        double max = 0.0;

        //obtain value to weight ratio
        for(i=0;i<t;i++)
        {
            ratio[i] = value[i]/(double)weight[i];
        }

        //sort in descending order
        for(i=0;i<t;++i)
        {
            for(int j=i+1;j<t;++j)
            {
                if(ratio[i]<ratio[j])
                {
                    double swap1 = ratio[i];
                    ratio[i] = ratio[j];
                    ratio[j] = swap1;

                    int swap2 = value[i];
                    value[i] = value[j];
                    value[j] = swap2;

                    int swap3 = weight[i];
                    weight[i] = weight[j];
                    weight[j] = swap3;

                }
            }   
        }

        double output_val = 0.0;
        //check how many complete units can be taken
        int x = W/weight[0];
        int temp_W = 0;
        //get value for completem units of item
        temp_W = temp_W + x*weight[0];
        output_val = output_val + x*value[0];
        int space = W - temp_W;
        //add the remaining value corresponding to the fraction left
        output_val = output_val + (space/(double)weight[0])*value[0];

        System.out.println(output_val);
        System.out.println(x + " complete units of item 1 plus " + space + "/" + weight[0] + " units of item 1");        
    }
    
    public static void main(String[] args)
    {
        Scanner ob = new Scanner(System.in);
        System.out.print("Enter number of items: ");
        int n = ob.nextInt();
        System.out.println(" ");
        int v[] = new int[n];
        int w[] = new int[n];
        System.out.print("Enter target: ");
        System.out.println(" ");
        int W=ob.nextInt();
        for(int i=0;i<n;i++)
        {
            System.out.println("Enter value  " + (i+1) + ": ");
            v[i] = ob.nextInt();
            System.out.println("Enter weight " + (i+1) + ": ");
            w[i] = ob.nextInt();
        }

        //object of class 
        unbounded_knapsack k = new unbounded_knapsack();
        k.output(v, w, W);
    }
}

Input:

We will input the number of items and the corresponding value and weight for each item. We also need to get the maximum capacity of our bag.

Output:

Enter number of items: 5

Enter Capacity: 50
Enter value 1:  140
Enter weight 1: 10
Enter value 2:  225
Enter weight 2: 15
Enter value 3:  80
Enter weight 3: 10
Enter value 4:  240
Enter weight 4: 20
Enter value 5:  120
Enter weight 5: 12

750.0
3 complete units of item 1 plus 5/15 units of item 1

Also read: Java Ternary operator with example

Leave a Reply

Your email address will not be published. Required fields are marked *