mirror of https://github.com/evanferrao/dsa
70 lines
2.4 KiB
Java
70 lines
2.4 KiB
Java
import java.util.*;
|
|
|
|
class Solution {
|
|
|
|
// Comparator function to sort items by value/weight ratio
|
|
static class ItemComparator implements Comparator<Item> {
|
|
public int compare(Item a, Item b) {
|
|
double r1 = (double) a.value / (double) a.weight;
|
|
double r2 = (double) b.value / (double) b.weight;
|
|
return Double.compare(r2, r1); // Return comparison based on value/weight ratio
|
|
}
|
|
}
|
|
|
|
// Method to calculate the maximum value we can get with fractional knapsack
|
|
public double fractionalKnapsack(int W, Item[] arr, int n) {
|
|
|
|
// Sort items based on the value/weight ratio
|
|
Arrays.sort(arr, new ItemComparator());
|
|
|
|
int curWeight = 0; // Current weight of knapsack
|
|
double finalvalue = 0.0; // Final value we can achieve
|
|
|
|
// Iterate through the sorted items
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
// If the current item can be fully added to the knapsack
|
|
if (curWeight + arr[i].weight <= W) {
|
|
curWeight += arr[i].weight;
|
|
finalvalue += arr[i].value; // Add the full value of the item
|
|
} else {
|
|
// If the current item can't be fully added, take the fractional part
|
|
int remain = W - curWeight;
|
|
finalvalue += (arr[i].value / (double) arr[i].weight) * (double) remain;
|
|
break; // Break as we have filled the knapsack
|
|
}
|
|
}
|
|
|
|
return finalvalue; // Return the maximum value that can be carried
|
|
}
|
|
|
|
// Class to represent an item with value and weight
|
|
static class Item {
|
|
int value;
|
|
int weight;
|
|
|
|
Item(int value, int weight) {
|
|
this.value = value;
|
|
this.weight = weight;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class Main {
|
|
|
|
public static void main(String[] args) {
|
|
|
|
// Input data
|
|
int n = 3, weight = 50; // Number of items and capacity of knapsack
|
|
Item[] arr = { new Item(100, 20), new Item(60, 10), new Item(120, 30) };
|
|
|
|
// Create an object of the Solution class
|
|
Solution obj = new Solution();
|
|
|
|
// Calculate the maximum value we can get with the fractional knapsack
|
|
double ans = obj.fractionalKnapsack(weight, arr, n);
|
|
|
|
// Output the result
|
|
System.out.println("The maximum value is: " + String.format("%.2f", ans));
|
|
}
|
|
} |