小U的早餐选择计算| 青训营X豆包MarsCode 技术训练营

58 阅读3分钟

1.问题描述

小U同学每天在早餐店有多种主食和饮料可以选择。给定两个数组,staples 表示不同主食的价格,drinks 表示不同饮料的价格。每天早上,小U最多会花费不超过 xx 元,他可能选择一份主食、一杯饮料,或只选择主食或饮料中的一个。你的任务是计算小U每天早上有多少种不同的选择,满足其最大花费不超过 xx。

例如:对于输入的主食价格 5 20 5 和饮料价格 5 5 2,如果小U的最大花费为 5,则一共有 5 种不同的选择。

2.代码解决方案(java)

1遍历主食数组,计算每种主食在预算内的购买次数,如果主食价格小于预算,则可以购买,计数加1

int total = 0;
staples and drinks alone
        for (int price : staples) {
            if (price <= x) {
                total += 1;
            }
        }

2.遍历饮料数组,计算每种饮料在预算内的购买次数,如果饮料价格小于预算,则可以购买,计数加1

for (int price : drinks) {
            if (price <= x) {
                total += 1;
            }
        }

3.遍历主食和饮料所有组合,计算组合在预算内的购买次数,如果主食和饮料组合的价格小于预算,则可以购买,计数加1

for (int staple_price : staples) {
            for (int drink_price : drinks) {
                if (staple_price + drink_price <= x) {
                    total += 1;
                }
            }
        }

4.返回总的购买组合数

return total;

3.程序UML类图

image.png

4.程序数据结构分析

  1. 数组(Arrays) :

    • staples: 一个整型数组,存储了主食的价格。
    • drinks: 另一个整型数组,存储了饮料的价格。

    这两个数组是问题的主要数据结构,它们分别存储了两种不同类型的商品价格。

  2. 整型变量(int) :

    • total: 用于累计满足条件的商品组合总数。
    • price: 在循环中用于遍历staplesdrinks数组中的单个价格。
    • staple_pricedrink_price: 在嵌套循环中分别表示staplesdrinks中的单个商品价格。

算法逻辑

  1. 计算单独选择主食或饮料的组合数:

    • 外层循环遍历staples数组,内层循环遍历drinks数组。
    • 对于每个价格,如果它小于或等于预算x,则total加1,表示可以选择该商品。
  2. 计算主食和饮料组合的组合数:

    • 嵌套循环遍历staplesdrinks数组中的所有可能组合。
    • 如果两个商品的价格之和小于或等于预算x,则total加1,表示这是一个有效的组合。

代码流程

  1. 初始化total为0。
  2. 遍历staples数组,对于每个小于或等于x的价格,total加1。
  3. 遍历drinks数组,对于每个小于或等于x的价格,total加1。
  4. 使用两层嵌套循环遍历staplesdrinks数组的所有组合。
  5. 对于每个组合,如果两个商品的价格之和小于或等于x,则total加1。
  6. 返回total作为结果。

5.程序算法分析及总结

该程序使用暴力枚举算法,解决了一个典型的组合优化问题,在给定预算的情况下,计算可以选择的主食和饮料及其组合的数量。

1.单独计算主食和饮料的选择数量

遍历staples数组,统计价格小于等于x的主食数量;遍历drinks数组,统计价格小于等于x的饮料数量。

时间复杂度:O(n+m),其中n是staples数组的长度,m是drinks数组的长度

2.计算主食和饮料的组合数量

使用双重循环遍历所有主食和饮料的组合,统计总价格小于等于x的组合数量

时间复杂度:O(n*m),其中n是staples数组的长度,m是drinks数组的长度

3.总体时间复杂度

总体时间复杂度为O(n+m+n*m),在实际应用中,通常n和m都不会太大,因此该算法在合理的数据规模下是可行的。