创林科技算法笔试题其一

版权声明:欢迎转载,若转载请给出本文链接 https://blog.csdn.net/niaonao/article/details/84206451
最大种类问题

    这里是第一个问题, 较为简单, 最大种类问题. 要求拿一定数量的钱去买最多种类的物品, 且所买商品不能重复.

题目

小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥。
面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超过预算上限。
于是她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。
.
输入规范:
每个输入包含两行。第一行是预算上限。
第二行是用空格分隔的一组数字,代表每种物品的价格。
所有数字都为正整数并且不会超过10000。
.
输出规范:
对每个输入,输出应买物品的总价格。
.
输入示例1:
100
50 50
输出示例1:
100
输入示例2:
188
50 42 9 15 105 63 14 30
输出示例2:
160

代码

    重点在于, 要求尽可能多的种类,每种只买一件,同时总价格还不能超过预算上限.
    这个问题偏易, 关于分析写在了代码的注释. 这里只是简单解出了答案, 还没有做的很严谨; 包括时间复杂度, 空间复杂度并没有考虑进来, 如果有更好的答案请分享一下 ^ _ ^ .

import java.util.Arrays;
import java.util.Scanner;

/**
 * @Description :最多商品种类问题
 * @Author:   niaonao
 */
public class GoodsPurchase {
    /**
     * 尽可能买多种类,每种一件
     * 所以买其中价格最低的且保证种类最多。
     * @param args
     */
    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        Scanner cin = new Scanner(System.in);

        //最大预算上限
        int limitMoney = sc.nextInt();

        //多种商品价格,存在不同的物品价格相同,50,50
        String numsStr[] = cin.nextLine().split("\\s");

        int goodsPrice[] = new int[numsStr.length];
        for (int i = 0; i < goodsPrice.length; i++) {
            goodsPrice[i] = Integer.parseInt(numsStr[i]);
        }

        //花费总金额
        int monry = mostGoodsWithinLimit(limitMoney, goodsPrice);

        System.out.println(monry);

    }

    /**
     * 计算不超出限额的情况下
     * 购买最多种类商品的总价格
     * (每种商品购买一个)
     * @param limitMoney
     * @param goodsPrice
     */
    private static int mostGoodsWithinLimit(int limitMoney, int[] goodsPrice) {
        //初始化购买物品总价格为0
        int allPrice = 0;

        //从小到大排序
        Arrays.sort(goodsPrice);

        //关键算法
        for (int i = 0; i < goodsPrice.length; i++) {
            int price = goodsPrice[i];
            allPrice = allPrice + price;
            if (allPrice > limitMoney) {
                allPrice -= price;
            }
        }

        return allPrice;
    }
}

互动一下

    什么你说上面的问题太简单, 下面再问你个简单的问题.
    说
    给你两个不规则容器, 已知容器的容量分别是3L 和5L, 请你在一个打开的水龙头处, 获取4L 的水. 注意, 这里的容器没有刻度, 不存在第三个容器.

猜你喜欢

转载自blog.csdn.net/niaonao/article/details/84206451