饭馆菜品选择问题| 豆包MarsCode AI刷题

47 阅读6分钟

问题背景

小C到了一家饭馆点菜,总共有 nnn 道菜,餐厅给出的菜品信息有两个部分:

  1. 每道菜的价格 aaa:用一个列表表示,例:a=[10,20,30]a = [10, 20, 30]a=[10,20,30] 表示三道菜的价格分别是 10 元、20 元、30 元。
  2. 每道菜是否含有蘑菇,用字符串 sss 表示:s[i]=′1′s[i] = '1's[i]=′1′ 代表第 iii 道菜含有蘑菇,s[i]=′0′s[i] = '0's[i]=′0′ 代表不含蘑菇。例如 s="010"s = "010"s="010",表示第二道菜含蘑菇,其他两道不含。

小C的需求:

  • 她必须点 kkk 道菜。
  • 她不喜欢蘑菇,希望点的菜中最多只有 mmm 道菜含有蘑菇。
  • 她希望选出的菜总价格尽可能低。

任务目标:

  • 找到满足上述条件的 kkk 道菜,使得总价格最低。
  • 如果无法满足条件,返回 -1。

分析问题

在这个问题中,我们需要解决以下几件事情:

  1. 选择 kkk 道菜: 小C想从 nnn 道菜中选出 kkk 道菜,这就要求我们能够列出所有可能的组合(选菜的方式),然后对这些组合进行评估。

  2. 评估组合是否满足条件: 每种选菜方式都需要满足两个条件:

    • 蘑菇菜的数量不能超过 mmm。
    • 总共选出的菜的数量必须为 kkk。
  3. 比较总价格: 对于满足条件的每一种组合,记录它们的总价格,并找出最低的价格。

  4. 无法满足条件时的特殊处理: 如果所有的组合都不符合条件,则返回 -1。


解决步骤

为了清晰说明问题,我们将整个流程拆解成几个具体的步骤:


步骤1:理解选菜的组合方式

从 nnn 道菜中选择 kkk 道菜,这涉及到组合问题。组合的含义是:

  • 从 nnn 个元素中选择 kkk 个元素,顺序不重要。

  • 比如,如果 n=3n = 3n=3,菜品编号是 [0,1,2][0, 1, 2][0,1,2],而 k=2k = 2k=2,那么所有可能的选菜组合是:

    • 选第1道和第2道菜:组合是 (0,1)(0, 1)(0,1)
    • 选第1道和第3道菜:组合是 (0,2)(0, 2)(0,2)
    • 选第2道和第3道菜:组合是 (1,2)(1, 2)(1,2)

生成这些组合是解决问题的基础,因为我们需要逐一检查这些组合是否满足条件。


步骤2:评估组合是否符合条件

对于每种组合(比如选出的两道菜的编号是 (0,1)(0, 1)(0,1)):

  1. 计算组合的总价格

    • 找到选出的菜的价格之和。例如,如果组合是 (0,1)(0, 1)(0,1),对应的价格是 a[0]+a[1]a[0] + a[1]a[0]+a[1]。
    • 总价格是用来比较哪种组合更“便宜”的关键。
  2. 计算组合中含蘑菇菜的数量

    • 对于选出的每一道菜,检查 s[i]s[i]s[i] 是否为 '1'。
    • 统计 s[i]=′1′s[i] = '1's[i]=′1′ 的数量。例如,如果 s="010"s = "010"s="010",而选出的组合是 (1,2)(1, 2)(1,2),则含蘑菇的数量为 1。
  3. 检查是否满足条件

    • 判断蘑菇菜数量是否 ≤m\leq m≤m。
    • 如果满足条件,这种组合是有效的;如果不满足条件,这种组合不考虑。

步骤3:找到满足条件的组合中价格最低的

对于所有满足条件的组合,记录它们的总价格:

  • 比较多个组合的价格,保留其中的最低价格。

  • 例如,如果有两个满足条件的组合:

    • 组合 (0,1)(0, 1)(0,1) 的总价格是 30;
    • 组合 (1,2)(1, 2)(1,2) 的总价格是 50;
    • 那么选择价格较低的 30。

步骤4:特殊情况处理

如果所有组合都不符合条件(即找不到任何满足条件的选菜方式):

  • 返回 -1,表示在满足条件的前提下无法选出 kkk 道菜。

示例解析

下面通过具体示例来说明流程:


示例1: 输入:s="001",a=[10,20,30],m=1,k=2s = "001", a = [10, 20, 30], m = 1, k = 2s="001",a=[10,20,30],m=1,k=2

  1. 所有可能的组合

    • 选出2道菜:可能的组合是 (0,1),(0,2),(1,2)(0, 1), (0, 2), (1, 2)(0,1),(0,2),(1,2)。
  2. 逐一评估每种组合

    • (0,1)(0, 1)(0,1):总价格 = 10+20=3010 + 20 = 3010+20=30,蘑菇菜数量 = 0(满足条件)。
    • (0,2)(0, 2)(0,2):总价格 = 10+30=4010 + 30 = 4010+30=40,蘑菇菜数量 = 0(满足条件)。
    • (1,2)(1, 2)(1,2):总价格 = 20+30=5020 + 30 = 5020+30=50,蘑菇菜数量 = 1(满足条件)。
  3. 找到最低价格

    • 满足条件的组合价格分别是 30、40 和 50,选择最低的价格 30。

输出:30。


示例2: 输入:s="111",a=[10,20,30],m=1,k=2s = "111", a = [10, 20, 30], m = 1, k = 2s="111",a=[10,20,30],m=1,k=2

  1. 所有可能的组合

    • 选出2道菜:可能的组合是 (0,1),(0,2),(1,2)(0, 1), (0, 2), (1, 2)(0,1),(0,2),(1,2)。
  2. 逐一评估每种组合

    • (0,1)(0, 1)(0,1):总价格 = 10+20=3010 + 20 = 3010+20=30,蘑菇菜数量 = 2(不满足条件)。
    • (0,2)(0, 2)(0,2):总价格 = 10+30=4010 + 30 = 4010+30=40,蘑菇菜数量 = 2(不满足条件)。
    • (1,2)(1, 2)(1,2):总价格 = 20+30=5020 + 30 = 5020+30=50,蘑菇菜数量 = 2(不满足条件)。
  3. 无法找到符合条件的组合

    • 所有组合都不满足条件。

输出:-1。


示例3: 输入:s="0101",a=[5,15,10,20],m=2,k=3s = "0101", a = [5, 15, 10, 20], m = 2, k = 3s="0101",a=[5,15,10,20],m=2,k=3

  1. 所有可能的组合

    • 选出3道菜:可能的组合是 (0,1,2),(0,1,3),(0,2,3),(1,2,3)(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)(0,1,2),(0,1,3),(0,2,3),(1,2,3)。
  2. 逐一评估每种组合

    • (0,1,2)(0, 1, 2)(0,1,2):总价格 = 5+15+10=305 + 15 + 10 = 305+15+10=30,蘑菇菜数量 = 1(满足条件)。
    • (0,1,3)(0, 1, 3)(0,1,3):总价格 = 5+15+20=405 + 15 + 20 = 405+15+20=40,蘑菇菜数量 = 2(满足条件)。
    • (0,2,3)(0, 2, 3)(0,2,3):总价格 = 5+10+20=355 + 10 + 20 = 355+10+20=35,蘑菇菜数量 = 2(满足条件)。
    • (1,2,3)(1, 2, 3)(1,2,3):总价格 = 15+10+20=4515 + 10 + 20 = 4515+10+20=45,蘑菇菜数量 = 2(满足条件)。
  3. 找到最低价格

    • 满足条件的组合价格分别是 30、40、35 和 45,选择最低的价格 30。

输出:30。