Leetcode 5690. 最接近目标价格的甜点成本

你打算做甜点,现在需要购买配料。目前共有 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

猜你喜欢

转载自blog.csdn.net/UZDW_/article/details/114219086