1774.最接近目标价格的甜点成本
解法一
baseCosts基料必选,toppingCosts配料不定数量,因此考虑用dfs搜索toppingCosts
class Solution:
def closestCost(self, baseCosts: List[int], toppingCosts: List[int], target: int) -> int:
self.res= sys.maxsize
self.minDis = sys.maxsize
self.list= []
n = len(baseCosts)
m = len(toppingCosts)
def dfs(i, j, cost):
if i >=n or j >= m : #递归出口(这里不能用cost > target条件剪枝
return
#第j种选k=0~2份
for k in range(3):
# 用tmp计算当前cost,不修改cost以保存现场
tmp = cost + toppingCosts[j]*k
#找到比res更接近target的数
if abs(tmp - target) <= abs(self.res - target):
#记录下来每个接近target的数
#【重点】写入list
self.res = tmp
self.minDis = abs(tmp - target)
self.list.append(tmp)
dfs(i, j+1, tmp) #dfs下一种配料
for i in range(n):
dfs(i, 0, baseCosts[i]) #基料必选,因此遍历基料,对每种配料dfs
#注意求的是【最接近】target的数中,【最小】的。
#因此还要再次筛选
#由于【最接近】的距离已经确定,因此只需要在【最接近】的限定范围中找【最小】的
finalRes=sys.maxsize
for i in self.list:
if abs(i - target) <= self.minDis and i < finalRes:
finalRes = i
return finalRes
gpt4的回答
首先我们需要理解题目要求的问题,题目要求在给定冰激凌基料、配料价格和目标价格情况下,寻找一种计算出的总成本接近目标价格的甜点配料方案。这里需要用到一些遍历和回溯的思路,思路如下:
定义一个全局变量 res 用于存放最接近目标价格的总成本,初始化为最大值。
将 toppingCosts 变量的数组进行排序,方便之后进行计算。
遍历所有的冰激凌基料,然后递归遍历所有的配料组合。
在递归过程中,需要添加当前选择的配料数量(从 0 到 2)计算当前方案的成本,然后回溯换下一个配料组合。
检查当前方案的成本是否比之前的更接近目标价格,然后更新 res 值。
最终返回 res 变量即可。
下面是这个思路的 Python 实现:
class Solution:
def closestCost(self,baseCosts, toppingCosts, target):
def dfs(i, cur_cost):
# 更新最接近目标价格的方案
nonlocal res
if abs(cur_cost - target) < abs(res - target) or (abs(cur_cost - target) == abs(res - target) and cur_cost < res):
res = cur_cost
# 达到最后一个配料
if i == len(toppingCosts):
return
# 尝试添加不同数量的配料
for j in range(3):
dfs(i + 1, cur_cost + j * toppingCosts[i])
res = float('inf')
toppingCosts.sort()
for cost in baseCosts:
dfs(0, cost)
return res
这个实现解决了题目的问题并通过了示例测试。其时间复杂度为 O(n * m^3),因为我们需要遍历所有的基料(n 种)和配料组合方案(m * 3)。
最后更新于