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);
}
}