题目描述:
现在有n个物品,每个物品都是液体,液体存在重量和价值,现在要求你只能从如下提供的液体中总共取走10升液体,每种液体每次可以不拿,全拿,或拿一部分,问取走的10升液体的最高价值是多少。请用程序来完成。
名称 重量(升) 总价值
水 4 24
牛奶 8 160
五粮液 2 4000
可乐 6 108
茅台 1 4000
具体功能点的要求如下
1、请按照如上数据的顺序,将每种液体数据依次添加到程序中来(注意:可以创建对象封装每种液体数据,并添加到ArrayList集合中去)
2、请用程序计算出取的10升液体的最高价值是多少?以及10升液体具体是哪些液体组成,各自取了多少。
分析:
//1.先定义water类,进行封装
//2.定义ArrayList集合,进行添加 使用的是Collections.addAll();
//3.使用的stream()进行排序 list.stream().sorted((o1,o2)->Double.compare(o2.getOnePrice() , o1.getOnePrice())).collect(Collectors.toList()) 降序
//4. 先装最贵的
代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class 液体 {
public static void main(String[] args) {
//1.定义液体对象
//2.添加到集合中
List<Water> list = new ArrayList<>();
Water water = new Water("水",4,24);
Water milk = new Water("牛奶",8,160);
Water five = new Water("五粮液",2,4000);
Water coke = new Water("可乐",6,108);
Water maotai = new Water("茅台",1,4000);
Collections.addAll(list,water,milk,five,coke,maotai);
list=list.stream().sorted((o1,o2)->Double.compare(o2.getOnePrice() , o1.getOnePrice())).collect(Collectors.toList());
System.out.println(list);
//3.遍历集合,计算总价值
double total = 0;
int all=10;
for(Water w:list){
int volume=w.getVolume();
if(volume<=all){
System.out.println(w.getName()+":"+volume);
total+=volume*w.getOnePrice();
all-=volume;
}
else{
System.out.println(w.getName()+":"+all);
total+=all*w.getOnePrice();
break;
}
}
System.out.println("总价:"+total);
}
}
import java.math.BigDecimal;
public class Water {
private String name;
private int volume;
private double value;
public double getOnePrice(){
BigDecimal value=BigDecimal.valueOf(this.value);
BigDecimal volume = BigDecimal.valueOf(this.volume);
return value.divide(volume,2,BigDecimal.ROUND_HALF_UP).doubleValue();
}
public Water(String name, int volume, double value) {
this.name = name;
this.volume = volume;
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getVolume() {
return volume;
}
public void setVolume(int volume) {
this.volume = volume;
}
public double getValue() {
return value;
}
public void setValue(double value) {
this.value = value;
}
public String toString(){
return "商品名称:"+this.name+" 商品价格:"+this.value+" 商品数量:"+this.volume+'\n';
}
}