• 这道题其实不难 难就难在有一些知识点没学 所以就花了很多时间来思考 怎么存放数据
  • 一开始我是用了一个二维数组 后面就改成了Arraylist 然后进行排序
  • 这道题并不是整箱整箱的拿 ,可以拿箱子的一部分 所以先将性价比高的拿出来
import java.util.*;
//定义一个礼物类 存放 礼物的value kg and v_k
class gift {
    int val;
    int kg;
    double v_k ;
}
//定义一个方法
    public void MAX() {
//double 统计总数量
        double count = 0;
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int theMax = sc.nextInt();
  //定义一个ArrayList 存放对象 因为一开始 我尝试用一个一维数组存放数据 结果发现 v_k得分开存放
        List ls = new ArrayList();
        int i = 0;
        while (i < num) {
            gift g = new gift();
            g.val = sc.nextInt();
            g.kg = sc.nextInt();
            //不能再类里面运算 ,不然会没有数据
            g.v_k = (double) g.val / g.kg;
            ls.add(g);
            i++;
        }
//这道题主要的核心我觉得是下面这个 之前没学 ,不知道java内置的ArrayList 排序方法
        ls.sort(new Comparator() {
            @Override
            public int compare(gift o1, gift o2) {
                if ((o1.v_k - o2.v_k)  0)
                    return 0;
                else if ((o1.v_k - o2.v_k) > 1e-6)
                    return -1;
                else
                    return 1;
            }
//调整1/-1 的值就可以让Arraylist 升序排序还是降序
        });
        //for each 遍历 查看是否为从大到小
//      for(gift e : ls) {
//          System.out.println(e.v_k);
//      }
        for(int temp = 0;temp < ls.size();temp++ ) {
            gift g = ls.get(temp);
            if(g.kg <= theMax) {
                count += g.val;
            }
            else if(g.kg > theMax ) {
                count += theMax * g.v_k; 
                break;
            }
            theMax -= g.kg;
        }
          System.out.printf("%.1f", count);
    }
    public static void main(String[] args) {
        Main m = new Main();
        m.MAX();
    }
}