你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则:
- 必须选择 一种 冰激凌基料。
- 可以添加 一种或多种 配料,也可以不添加任何配料。
- 每种类型的配料 最多两份 。
给你以下三个输入:
- baseCosts ,一个长度为 n 的整数数组,其中每个 baseCosts[i] 表示第 i 种冰激凌基料的价格。
- toppingCosts,一个长度为 m 的整数数组,其中每个 toppingCosts[i] 表示 一份 第 i 种冰激凌配料的价格。
- target ,一个整数,表示你制作甜点的目标价格。
你希望自己做的甜点总成本尽可能接近目标价格 target 。
返回最接近 target 的甜点成本。如果有多种方案,返回 成本相对较低 的一种。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/closest-dessert-cost
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
蛮力,深搜
class Solution {
public int closestCost(int[] baseCosts, int[] toppingCosts, int target) {
int ans=baseCosts[0];
for (int baseCost : baseCosts) {
ans = c(ans, dfs(toppingCosts.length, baseCost, toppingCosts, baseCost, target), target);}
return ans;
}
public int c(int ans,int targetControl,int target){
if(Math.abs(ans-target)<Math.abs(targetControl-target))targetControl=ans;
if(Math.abs(ans-target)==Math.abs(targetControl-target))targetControl=Math.min(targetControl,ans);
return targetControl;
}
public int dfs(int m,int base, int[] toppingCosts, int targetControl,int target){
if(m==0)return targetControl;
return c(dfs(m-1,base+2*toppingCosts[m-1],toppingCosts,c(base +2*toppingCosts[m-1],targetControl,target),target),c(dfs(m-1,base,toppingCosts,c(base,targetControl,target),target),dfs(m-1,base+toppingCosts[m-1],toppingCosts,c(base +toppingCosts[m-1],targetControl,target),target),target),target);
}
}
通过对数据规模的分析,可以考虑蛮力深搜,深度最多为10,最大搭配方案种类为10·3^10=590490