阿里2018测评编程题——小明购物。。。

以下是小编写的代码,鉴于编程技巧笨拙,旨在和大家交流学习!!!

package scan.input;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class ScanInput{

//记录优惠信息和商品信息
static Map<Double, Double> map = new HashMap<Double,Double>();
static List<String> li = new ArrayList<String>();
//存放价格信息
static String[] price =null;
//存放组合商品的价格之和
static List<String> totalValue = new ArrayList<String>();
static //存放最终花费的金额
double allPrice=0;

//递归计算所有组合的商品价格之和
private static void combine(){
int start=0;
int end=price.length;
for(int i=start;i<end;i++){
double tmp=Double.valueOf(price[i]).doubleValue();
totalValue.add(Double.toString(tmp));
//System.out.println("#########&&&&&&&"+tmp);
nextLi(++start,end,tmp);
}
}

private static void nextLi(int start, int end, double tmp){
for(int i=start;i<end;i++){
double allValue=tmp;
//System.out.println("&&&&&&&&"+tmp+price[i]);
allValue+=Double.valueOf(price[i]);

totalValue.add(Double.toString(allValue));
int empI=i;
nextLi(++empI,end,allValue);
}

}
//找出所购买商品的最大价值
static void goodsAllValue(){

Map<Double, Double> mapValue = new HashMap<Double,Double>();
/*for(String toVal:totalValue){
System.out.println("tolVal#######+"+toVal);
}*/
//计算出商品优惠后价格总额与参加的最合适的优惠信息mapValue<所购商品优惠后价格总额,减去的优惠金额>
for(int i=0;i<totalValue.size();i++){

double maxKey=0;
double s=Double.valueOf(totalValue.get(i)).doubleValue();
//System.out.println("s@@@@@@="+totalValue.get(i));
for(Double key:map.keySet()){

//找出优惠信息中最接近当前价格组合s的优惠信息的key值
if(s>=key){
//System.out.println("s="+s+",map="+key);
if(key>maxKey){
maxKey=key;
}
}else continue;

}
if(maxKey!=0.0){
//System.out.println("最合适的优惠信息key:"+maxKey);
double cutP=map.get(maxKey);
mapValue.put(s-cutP, cutP);
//System.out.println("!!!!!"+s+"@@@@@"+cutP);
}else continue;
//System.out.println("@@@@@@@");
//System.out.println("所有商品组合价格和分别为:"+totalValue.get(i));
}
double maxS=0;
//找出在限定花费金额条件下最高的原商品总额
for(Double key:mapValue.keySet()){
if(allPrice>=key){
double lastS=key+mapValue.get(key);
if(lastS>maxS){
maxS=lastS;
}
}else continue;
}
System.out.println("最大的商品价值为:"+maxS);

}



public static void main(String[] args){

Scanner scan=new Scanner(System.in);
System.out.println("请输入商品总数:");
int goodsNum=scan.nextInt();
System.out.println("请输入花费的金额总数:");
allPrice=scan.nextDouble();
System.out.println("请输入优惠方式的总数");
int favNum =scan.nextInt();

//接收控制台的输入商品信息
for(int i=0;i<goodsNum;i++){
int a=i+1;
System.out.println("请输入商品"+a+"的价格:");
double goodsPrice=scan.nextDouble();
//map1.put(goodsName,goodsPrice);
li.add(Double.toString(goodsPrice));
}

//接收控制台输入的优惠信息
for(int i=0;i<favNum;i++){
int a=i+1;
System.out.println("请输入优惠方式"+a+"的满减条件金额:");
double favStart=scan.nextDouble();
System.out.println("请输入优惠方式"+a+"减去金额:");
double favCut=scan.nextDouble();
map.put(favStart, favCut);
}


//价格数据放到数组中
price = new String[li.size()];
li.toArray(price);
//商品组合排序计算
combine();
//找出最大价值
goodsAllValue();


}


}

猜你喜欢

转载自blog.csdn.net/MRSPAN/article/details/77417422