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