题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N(N≤100) 堆金币,第 i堆金币的总重量和总价值分别是m_i,v_i(1≤m_i,v_i≤100)。阿里巴巴有一个承重量为 T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入格式
第一行两个整数 N,T。
接下来 N行,每行两个整数 m_i,v_i。
题解
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int N=scan.nextInt(),T=scan.nextInt();
ArrayList<Gold> list = new ArrayList<>();
for(int i=0;i<N;i++) {
list.add(new Gold(scan.nextInt(),scan.nextInt()));
}
Collections.sort(list);
double sum=0;
for(Gold i:list) {
if(T-i.m<=0) {
sum+=i.w*T;
break;
}else{
sum+=i.v;
T=T-i.m;
}
}
System.out.printf("%.2f",sum);
scan.close();
}
}
class Gold implements Comparable<Gold>{
public int m;
public int v;
public double w;
public Gold(int m,int v) {
this.m = m;
this.v = v;
this.w = (double)v/m;
}
@Override
public String toString() {
return "Gold [m=" + m + ", v=" + v + ", w=" + w + "]";
}
@Override
public int compareTo(Gold o) {
if(this.w>=o.w) {
return -1;
}else {
return 1;
}
}
}