Python 程序查找最接近的甜点成本


假设我们有两个数组,称为 baseCosts,其中包含 n 个项目,我们可以从中选择基础,toppingCosts,其中包含 m 个项目,我们可以从中选择浇头,并且还有一个目标值。我们必须遵循以下规则来制作甜点。

  • 必须恰好有一个基础。

  • 我们可以添加一个或多个浇头,或者根本不添加浇头。

  • 每种浇头的数量最多为两个。

这里 baseCosts[i] 表示第 i 个冰淇淋基础的价格。toppingCosts[i] 表示第 i 个浇头的价格。目标值表示甜点的目标价格。我们必须制作一个总成本尽可能接近目标的甜点。我们必须找到甜点最接近目标的可能成本。如果有多个答案,则返回较小的那个。

因此,如果输入类似于 baseCosts = [2,8],toppingCosts = [4,5],target = 12,则输出将为 12,因为我们可以选择成本为 8 的基础,然后选择成本为 4 的第一个浇头 1 个,并且不选择类型 2 的浇头,所以总成本为 8+4 = 12。

为了解决这个问题,我们将遵循以下步骤 -

  • best_cost := baseCosts[0]

  • 对于 b 从 0 到 baseCosts 大小 - 1,执行

    • bitmask := 一个大小与 toppingCosts 大小相同的数组,并用 0 填充

    • 无限循环执行以下操作:

      • current_price := baseCosts[b]

      • 对于 j 从 0 到 bitmask 大小 - 1,执行

        • current_price := current_price + bitmask[j] * toppingCosts[j]

      • 如果 current_price - target 等于 0,则

        • 返回 target

      • 否则,当 |current_price - target| < |best_cost - target| 时,则

        • best_cost := current_price

      • 否则,当 |current_price - target| 等于 |best_cost - target| 时,则

        • 如果 current_price < best_cost,则

          • best_cost := current_price

      • 如果 bitmask 中没有 0 且 bitmask 中没有 1,则

        • 退出循环

      • 对于 i 从 0 到 bitmask 大小 - 1,执行

        • 如果 bitmask[i] 不等于 2,则

          • bitmask[i] := bitmask[i] + 1

          • 退出循环

        • 否则,

          • bitmask[i] := 0

  • 返回 best_cost

示例

让我们看看以下实现以获得更好的理解 -

def solve(baseCosts, toppingCosts, target):
   best_cost = baseCosts[0]

   for b in range(len(baseCosts)):
      bitmask = [0] * len(toppingCosts)
      while True:
         current_price = baseCosts[b]
         for j in range(len(bitmask)):
            current_price += bitmask[j] * toppingCosts[j]
         if current_price - target == 0:
            return target
         elif abs(current_price - target) < abs(best_cost - target):
            best_cost = current_price
         elif abs(current_price - target) == abs(best_cost - target):
            if current_price < best_cost:
               best_cost = current_price

         if 0 not in bitmask and 1 not in bitmask:
            break
         for i in range(len(bitmask)):
            if bitmask[i] != 2:
               bitmask[i] += 1
               break
            else:
               bitmask[i] = 0
   return best_cost

baseCosts = [2,8]
toppingCosts = [4,5]
target = 12
print(solve(baseCosts, toppingCosts, target))

输入

[2,8], [4,5], 12

输出

12

更新于: 2021 年 10 月 6 日

169 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.