import java.util.*;
public class Backpack {
public static LinkedList<GreedyItem> packBean(int packCapacity, GreedyItem[] items) {
LinkedList<GreedyItem> beans = new LinkedList<GreedyItem>();
Arrays.sort(items, new Comparator<GreedyItem>() {
public int compare(GreedyItem left, GreedyItem 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;
beans.add(new GreedyItem(items[i]));
} else {
double unitPrice = items[i].totalValue / items[i].totalWeight;
double packWeight = leftPackCapacity;
double packValue = packWeight * unitPrice;
beans.add(new GreedyItem(items[i].name, packWeight, packValue));
leftPackCapacity = 0;
break;
}
}
return beans;
}
public static void main(String[] args) {
GreedyItem[] items = {
new GreedyItem("黄豆", 100, 100),
new GreedyItem("绿豆", 30, 90),
new GreedyItem("红豆", 60, 120),
new GreedyItem("黑豆", 20, 80),
new GreedyItem("青豆", 50, 75)
};
LinkedList<GreedyItem> beans = packBean(100, items);
double maxValue = 0;
System.out.println("装了如下物品:");
for (GreedyItem bean : beans) {
maxValue += bean.totalValue;
System.out.println(bean.name + " " + bean.totalWeight);
}
System.out.println("总价值:" + maxValue);
}
}
class GreedyItem {
String name;
double totalWeight;
double totalValue;
GreedyItem(String name, double totalWeight, double totalValue) {
this.name = name;
this.totalWeight = totalWeight;
this.totalValue = totalValue;
}
GreedyItem(GreedyItem item) {
this.name = item.name;
this.totalWeight = item.totalWeight;
this.totalValue = item.totalValue;
}
}