题目描述
有一个背包,背包容量是M。现有5个物品,每个物品有其重量W和价值V,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
输入格式
输入数据首先包括一个整数T,表示有T组测试用例,每组测试用例包括3行,第一行有一个整数表示背包容量,第二行有5个整数分别表示5个物品的重量,第三行有五个整数分别表示5个物品的价值。
输出格式
对于每组测试用例,计算装入背包的最大价值并输出,结果保留两位小数,每个输出占一行。
样例输入content_copy
2
100
35 30 60 50 40
10 40 30 50 35
10
1 2 3 4 5
2 6 9 8 10
样例输出content_copy
107.50
25.00
package main;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class bean {
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
for (int i = 0; i < n; i++) {
int mybagSize= cin.nextInt();
bag[] s=new bag[5];
List<bag>b=new ArrayList<>();
for (int j = 0; j < 5; j++) {
s[j]=new bag();
s[j].size=cin.nextInt();
}
for (int j = 0; j < 5; j++) {
s[j].price=cin.nextInt();
s[j].prs=s[j].price/(s[j].size*1.0);
}
for (int j = 0; j < 5; j++) {
b.add(s[j]);
}
Collections.sort(b, new Comparator<bag>() {
@Override
public int compare(bag o1, bag o2) {
return o2.prs.compareTo((o1.prs));
}
}
);
double sum=0;
for (int j = 0; j < 5; j++) {
if (mybagSize>=b.get(j).size){
sum+=b.get(j).price;
mybagSize-=b.get(j).size;
if (mybagSize==0)
break;
}
else {
sum+=b.get(j).prs*mybagSize; break;
}
}
System.out.printf("%.2f\n",sum); }
}
}
class bag{
int price; int size; Double prs; }