编辑代码

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;

class Main {
    public static void main(String[] args) {
        Sty sty = new Sty();
        Fruit[] fruits = {
                new Fruit("苹果", 15, 300),
                new Fruit("香蕉", 18, 180),
                new Fruit("橘子", 10, 150),
                new Fruit("猕猴桃", 9, 270),
        };
        sty.findMaxValueFruits(fruits, 20);
    }
}

class Fruit {
    public String name;
    public int weight;
    public int value;

    Fruit(String name, int weight, int value) {
        this.name = name;
        this.weight = weight;
        this.value = value;
    }

    Fruit(Fruit fruit) {
        this.name = fruit.name;
        this.weight = fruit.weight;
        this.value = fruit.value;
    }
}

class Sty {
    public static LinkedList<Fruit> packKnapsack(int bagWeight, Fruit[] fruits) {
        LinkedList<Fruit> knapsack = new LinkedList<>();
        Arrays.sort(fruits, Comparator.comparingDouble(fruit -> -1.0 * fruit.value / fruit.weight));
        int remainingCapacity = bagWeight;

        for (Fruit fruit : fruits) {
            if (remainingCapacity > fruit.weight) {
                remainingCapacity -= fruit.weight;
                knapsack.add(new Fruit(fruit));
            } else {
                int unitPrice = fruit.value / fruit.weight;
                int selectedWeight = remainingCapacity;
                int selectedValue = selectedWeight * unitPrice;
                knapsack.add(new Fruit(fruit.name, selectedWeight, selectedValue));
                remainingCapacity = 0;
                break;
            }
        }
        return knapsack;
    }

    public static void findMaxValueFruits(Fruit[] fruits, int weightLimit) {
        LinkedList<Fruit> knapsack = packKnapsack(weightLimit, fruits);
        int totalValue = 0;

        System.out.println("最优装水果策略如下:");
        for (Fruit fruit : knapsack) {
            totalValue += fruit.value;
            System.out.println("放入 " + fruit.weight + "个" + fruit.name);
        }
        System.out.println("总价值:" + totalValue);
    }
}