package greedy;
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
class Fruit {
public String name;
public double totalWeight;
public double totalValue;
Fruit(String name, double weight, double value) {
this.name = name;
this.totalWeight = weight;
this.totalValue = value;
}
Fruit(Fruit item) {
this.name = item.name;
this.totalWeight = item.totalWeight;
this.totalValue = item.totalValue;
}
}
public class GreedyFruitBackpack {
public static LinkedList<Fruit> packFruit(int packCapacity, Fruit[] items){
LinkedList<Fruit> fruits = new LinkedList<Fruit>();
Arrays.sort(items, new Comparator<Fruit>() {
public int compare(Fruit left, Fruit right) {
double leftUnitPrice = left.totalValue/left.totalWeight;
double rightUnitPrice = right.totalValue/right.totalWeight;
if (leftUnitPrice > rightUnitPrice) {
return -1;
} else if (leftUnitPrice == rightUnitPrice) {
return 0;
} else {
return 1;
}
}
});
int leftPackCapacity = packCapacity;
for (int i = 0; i < items.length; ++i) {
if (leftPackCapacity > items[i].totalWeight) {
leftPackCapacity -= items[i].totalWeight;
fruits.add(new Fruit(items[i]));
} else {
double unitPrice = items[i].totalValue/items[i].totalWeight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
fruits.add(new Fruit(items[i].name, packWeight, packValue));
leftPackCapacity = 0;
break;
}
}
return fruits;
}
public static void test() {
Fruit[] items = {
new Fruit("苹果", 15, 300),
new Fruit("香蕉", 18, 180),
new Fruit("橘子", 10, 150),
new Fruit("猕猴桃", 9, 270),
};
LinkedList<Fruit> fruits = packFruit(20, items);
double maxValue = 0;
System.out.println("装了如下水果:");
for (int i = 0; i < fruits.size(); ++i) {
maxValue += fruits.get(i).totalValue;
System.out.println(fruits.get(i).name + " 重量:" + fruits.get(i).totalWeight + "kg");
}
System.out.println("总价值:" + maxValue);
}
}