面试算法题:输入金额,输入若干商品价格,买尽可能多的种类商品

题目:

小明的女朋友最喜欢在网上买东西,可是钱包里的钞票有限,不能想买啥就买啥。面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时价格不能超过上限。于是 她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。

输入规范:

每个输入包含两行。第一行是预算上限,第二行是用空格分隔的一组数字,代表每种物品的价格,所有的数字都为正整数并且不会超过10000。

输出规范:

对每个输入,输出应买物品的总价格。

输入示例1:

100

50 50

输出示例1:

100

输入示例2:

188

50 42 9 15 105 63 14 30

输出示例:

160

 

解题思路:首先商品的种类不是固定的(可以输入若干商品价格),我采用集合ArrayList来存放商品价格,然后进行从小到大排序,遍历该集合,

如果当前拥有的钱 total 大于该物品价格price,则说明可以购买,

当前的钱减去该商品    价格total = total-price,

总价增加 sum+= price,若当前拥有的钱,小于price,则说明无法购买,跳出循环,打印总价sum。

代码如下:

package com.xuanqi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] arges) {

        Scanner sc1 = new Scanner(System.in); //输入月份和日期
        Scanner sc2 = new Scanner(System.in); //输入 大写字母字符串
        //接受输入参数
        String m = sc1.nextLine();
        String n = sc2.nextLine();

        List prices = new ArrayList<>();

        String temp[] = n.split("\\s+");
        for (String s : temp) {
            Integer price = Integer.parseInt(s);
            if (price != null && price <= 10000 && price > -1) {//判断输入的是否为数字
                prices.add(price);
            }
        }
        Collections.sort(prices); //将输入的价格进行排序

        Integer total = Integer.parseInt(m); //获取输入的预算上限
        Integer sum = 0;
        /**
         * 遍历价格集合,prices是有序的集合,从小到大排列
         *      total 为当前拥有的钱,如果total >= price ,说明可以买此商品,
         *      则total = total - price;
         *      此时,计算总价 sum += price
         *      直到total < price 说明当前拥有的钱不够支付下一个商品,则跳出循环 打印sum总价;
         */
        for (Integer price : prices) {
            if (total >= price) {
                total = total - price;
                sum += price;
            }else{
                break;
            }
        }
        System.out.println(sum);
    }
}

你可能感兴趣的:(算法,面试,java)