import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
public class Backpack {
public static class GreedyFruit {
public String name;
public double totalWeight;
public double totalValue;
public GreedyFruit(String fruitName, double weight, double value) {
this.name = fruitName;
this.totalWeight = weight;
this.totalValue = value;
}
public GreedyFruit(GreedyFruit fruit) {
this.name = fruit.name;
this.totalWeight = fruit.totalWeight;
this.totalValue = fruit.totalValue;
}
}
public static LinkedList<GreedyFruit> packFruit(int packCapacity, GreedyFruit[] fruits){
LinkedList<GreedyFruit> result = new LinkedList<GreedyFruit>();
Arrays.sort(fruits, new Comparator<GreedyFruit>() {
public int compare(GreedyFruit left, GreedyFruit 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 < fruits.length; ++i) {
if (leftPackCapacity > fruits[i].totalWeight) {
leftPackCapacity -= fruits[i].totalWeight;
result.add(new GreedyFruit(fruits[i]));
}
else {
double unitPrice = fruits[i].totalValue/fruits[i].totalWeight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
result.add(new GreedyFruit(fruits[i].name, packWeight, packValue));
leftPackCapacity = 0;
break;
}
}
return result;
}
public static void test() {
GreedyFruit[] fruits = {
new GreedyFruit("苹果", 15, 300),
new GreedyFruit("香蕉", 18, 180),
new GreedyFruit("橘子", 10, 150),
new GreedyFruit("猕猴桃", 9, 270)
};
LinkedList<GreedyFruit> result = packFruit(20, fruits);
double maxValue = 0;
System.out.println("装了如下物品:");
for (GreedyFruit fruit : result) {
maxValue += fruit.totalValue;
System.out.println(fruit.name + " " + fruit.totalWeight+" kg");
}
System.out.println("总价值:" + maxValue+" 元");
}
public static void main(String[] args) {
test();
}
}