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);
}
}
};
2. 动态规划
- 没写,后续补上。
关注公众号,感受不同的阅读体验
下期预告: 明天的每日一题