编辑代码

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

}