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


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

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

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


一、题目描述

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

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

  • 示例 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 个;

【坚持不懈的每日一题——力扣篇】1774. 最接近目标价格的甜点成本(中等)-- dfs / dp_第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);
        }
    }
};

2. 动态规划

  • 没写,后续补上。

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

请添加图片描述


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

你可能感兴趣的:(坚持不懈的每日一题——力扣篇,深度优先,leetcode,算法,动态规划,c++)