题目描述
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需
求量,请你计算可以获得的最大收益是多少。
注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有3种月饼,其库存量分别为18、15、10万吨,总售价分别为75、
72、45亿元。如果市场的最大需求量只有20万吨,那么我们最大收益策略应该是卖出全部15万吨第2种月饼、以及5万吨第3种月饼,获得
72 + 45/2 = 94.5(亿元)。
输入描述:
每个输入包含1个测试用例。每个测试用例先给出一个不超过1000的正整数N表示月饼的种类数、以及不超过500(以万吨为单位)的正整数
D表示市场最大需求量。随后一行给出N个正数表示每种月饼的库存量(以万吨为单位);最后一行给出N个正数表示每种月饼的总售价(以亿
元为单位)。数字间以空格分隔。
输出描述:
对每组测试用例,在一行中输出最大收益,以亿元为单位并精确到小数点后2位。
输入例子:
3 20
18 15 10
75 72 45
输出例子:
94.50
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @ProjectName: 20201019牛客刷题
* @Package: test
* @ClassName: MoonCake
* @Author: 民
* @Description: 月饼
* @Date: 2020/10/20 17:44
* @Version: 1.0
*/
public class MoonCake {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//1.记录数据
//月饼种类数 背包容量
//每种月饼的总价格 每种月饼的总重量
//单位月饼的价值
//标记数组
String[] values1 = br.readLine().split(" ");
int n = Integer.parseInt(values1[0]);//n是月饼种类数
int w = Integer.parseInt(values1[1]);//w是背包容量
String[] values2 = br.readLine().split(" ");
String[] values3 = br.readLine().split(" ");
int[] v = new int[n];//存放价格
int[] weight = new int[n];//存放重量
for (int i = 0; i < n; i++) {
v[i] = Integer.parseInt(values3[i]);
weight[i] = Integer.parseInt(values2[i]);
}
double[] value_s = new double[n];//单位价格
boolean[] flag = new boolean[n];//标记
for (int i = 0; i < values2.length; i++) {
value_s[i] = Double.parseDouble(values3[i])/Double.parseDouble(values2[i]);
}
//2. 贪心算法,每次放最大价值的物品 直到背包放满了
double money = 0;
while (w>0){
int index = findMax(value_s,flag);//2.1 找到当前数组最大值,注意此时要选择没有被标记过的月饼
if(w>weight[index]){//2.2 当前背包充裕,将整一种月饼全都放入背包
w-=weight[index];//背包容量减少
money+=v[index];//盈利增多
flag[index]=true;//标记数组,表明已经被拿走了
}else {//2.3 若当前月饼不能完全放下了,只剩下一点空间
money += w*value_s[index];//能放多少放多少,能赚多少是多少
break;
}
}
System.out.printf("%.2f",money);
}
public static int findMax(double[] v,boolean[] flag){//根据两个数组找到当前数组的最大值索引位置
int index=0;
double max = v[0];
for (int i = 0; i < v.length; i++) {
if (max<=v[i]&&!flag[i]){
max = v[i];
index = i;
}
}
return index;
}
}

京公网安备 11010502036488号