题目描述
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有N(N≤100) 堆金币,第 i 堆金币的总重量和总价值分别是mi,vi(1≤mi,vi≤100)。阿里巴巴有一个承重量为 T(T≤1000) 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?
输入格式
第一行两个整数N,T。
接下来 N 行,每行两个整数 mi,vi。
输出格式
一个实数表示答案,输出两位小数
输入输出样例
输入
4 50 10 60 20 100 30 120 15 45
输出
240.00
原题链接:【深基12.例1】部分背包问题 - 洛谷
思路:因为能随意分割所以算出每个物品的单价 从单价最高的拿
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int t = sc.nextInt();
Item[] items = new Item[n];
for(int i =0;i<n;i++) {
items[i] = new Item(sc.nextInt(),sc.nextInt());
}
Arrays.sort(items);
int backpacker = t;
double ans = 0;
for(int i =0;i<n;i++) {
if(backpacker-items[i].w>0) {
backpacker-=items[i].w;
ans+=items[i].v;
}
else {
ans+=items[i].unitprice()*backpacker;
break;
}
}
System.out.printf("%.2f",ans);
sc.close();
}
}
class Item implements Comparable<Item>{
int v;
int w;
public Item(int _w,int _v) {
w = _w;v = _v;
}
public double unitprice() {
return v*1.0/w;
}
@Override
public int compareTo(Item o) {
// TODO Auto-generated method stub
if(unitprice()-o.unitprice()>0) {
return -1;
}
else if(unitprice()-o.unitprice() == 0) {
return 0;
}
else
return 1;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "v "+v+
" w "+w+
" unitprice "+unitprice();
}
}