Tuesday, August 30, 2016

Fractional Knapsack

Algorithm- Fractional Knapsack

import java.util.Scanner;

public class Knapsack01 {
     public static void main(String[] args) {
           Scanner scan = new Scanner(System.in);
           int n = scan.nextInt(); // 1
           int W = scan.nextInt(); // 1000
           float value[] = new float[n]; // 500
           float weight[] = new float[n]; // 30
           float ratio[] = new float[n];
           for (int i = 0; i < n; i++) {
                value[i] = scan.nextInt();
                weight[i] = scan.nextInt();
                ratio[i] = value[i] / weight[i];
           }
           float totalValue = knapSack01(W, value, weight, ratio, n);
           System.out.println(totalValue);
     }

     public static float knapSack01(float W, float[] value, float weight[], float ratio[],
                int n) {
           float V = 0;
           while (n>0 && W!=0) {
                int mI = maxIndex(n, ratio);
                float w=min(weight[mI],W);
                // W=40,weight[2]=30 // W=10,weight[0]=20;
                W = W - w;
                V = V + w*ratio[mI];
                weight[mI]=weight[mI]-w;
                ratio[mI] = 0;
                n--;
           }
           return V;
     }
     public static float min(float a,float b){
           return a>b?b:a;
     }

     public static int maxIndex(int n, float ratio[]) {
           float largest = Integer.MIN_VALUE;
           int lastIndex = 0;
           for (int i = 0; i < n; i++) {
                if (ratio[i] > largest) {
                     largest = ratio[i];
                     lastIndex = i;
                }
           }
           return lastIndex;
     }
}

Output:
Input: 3 50
60 20 100
50 120 30

Output: 180.0000

No comments:

Post a Comment