• 【坚持不懈的每日一题——力扣篇】1774. 最接近目标价格的甜点成本(中等)-- dfs / dp



    GitHub同步更新(已分类)Data_Structure_And_Algorithm-Review

    公众号:URLeisure 的复习仓库
    公众号二维码见文末

    以下是本篇文章正文内容,下面案例可供参考。


    一、题目描述

    • 力扣今天推的每日一题是道中等题 。

    在这里插入图片描述

    • 示例 1:

    输入:baseCosts = [1,7], toppingCosts = [3,4], target = 10
    输出:10
    解释:考虑下面的方案组合(所有下标均从 0 开始):

    • 选择 1 号基料:成本 7
    • 选择 1 份 0 号配料:成本 1 x 3 = 3
    • 选择 0 份 1 号配料:成本 0 x 4 = 0
      总成本:7 + 3 + 0 = 10 。
    • 示例 2:

    输入:baseCosts = [2,3], toppingCosts = [4,5,100], target = 18
    输出:17
    解释:考虑下面的方案组合(所有下标均从 0 开始):

    • 选择 1 号基料:成本 3
    • 选择 1 份 0 号配料:成本 1 x 4 = 4
    • 选择 2 份 1 号配料:成本 2 x 5 = 10
    • 选择 0 份 2 号配料:成本 0 x 100 = 0
      总成本:3 + 4 + 10 + 0 = 17 。不存在总成本为 18 的甜点制作方案。
    • 示例 3:

    输入:baseCosts = [3,10], toppingCosts = [2,5], target = 9
    输出:8
    解释:可以制作总成本为 8 和 10 的甜点。返回 8 ,因为这是成本更低的方案。

    • 示例 4:

    输入:baseCosts = [10], toppingCosts = [1], target = 1
    输出:10
    解释:注意,你可以选择不添加任何配料,但你必须选择一种基料。

    • 提示
    • n == baseCosts.length
    • m == toppingCosts.length
    • 1 <= n, m <= 10
    • 1 <= baseCosts[i], toppingCosts[i] <= 1 0 4 10^4 104
    • 1 <= target <= 1 0 4 10^4 104

    二、解题思路

    1. 暴搜 -> DFS

    • 提示中 1 <= n, m <= 10 ,一看到范围就想到暴力搜索了 QAQ。

    • 枚举所有基料,对每种基料搜索所有配料的可能情况,返回最优解。

    • 每种基料有三种选择:不选,选 1 个,选 2 个;

    在这里插入图片描述

    • 当 cost > target 时,成本已经超过了目标价格,后续就不用再判断了。

    • 按上图编写算法,添加终止条件 -> cost > target 时终止即可。

    2. 动态规划

    • 今天有点忙,没写,后续补上。

    三、解题代码

    1. 暴搜 -> DFS

    class Solution {
    public:
        // 比较大小,设个最大值
        int ans = 0x3f3f3f3f;
    
        int closestCost(vector<int> &baseCosts, vector<int> &toppingCosts, int target) {
            for (int i: baseCosts) {
                dfs(0, i, toppingCosts, target);
            }
            return ans;
        }
    
        void dfs(int i, int cost, vector<int> toppingCosts, int target) {
            int a = abs(target - ans), b = abs(target - cost);
    
            // 判断最优解
            if (a > b) ans = cost; // 选个最接近 target 的花费
            if (a == b && ans > cost) ans = cost; // cost1=8 target=10 cost2=12 ---> 最优解为成本少的 8 
            // 终止条件
            if (cost > target) return;
            for (int j = i; j < toppingCosts.size(); ++j) {
                dfs(j + 1, cost + toppingCosts[j], toppingCosts, target);
                dfs(j + 1, cost + 2 * toppingCosts[j], toppingCosts, target);
            }
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2. 动态规划

    • 没写,后续补上。

    关注公众号,感受不同的阅读体验

    请添加图片描述


    下期预告: 明天的每日一题

  • 相关阅读:
    基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)
    常用器件说明
    Pytest运行指定的case,这个方法真的很高效……
    TypeScript_面向对象
    c++继承
    【k8s】Kubernetes 原理剖析与实战应用(更新中)
    如何获取和分析Java堆信息
    Mongodb单机、复制集Replica Sets、分片集群Shard Cluster安装详解
    DJYOS开源往事二:DJYOS开源工作室时期
    linux平台源码编译ffmpeg
  • 原文地址:https://blog.csdn.net/weixin_50564032/article/details/128174923