1774. 最接近目标价格的甜点成本
- 枚举所有能选的基料,选定一种基料后,搜索所有配料的可能性
- 每种配料有三种选择:[选1个,选2个,不选],保存最优的结果即可
class Solution {
int res;
public int closestCost(int[] baseCosts, int[] toppingCosts, int target) {
int min=Arrays.stream(baseCosts).min().getAsInt();
if(min>=target) return min;
res=min;
for(int x:baseCosts) dfs(toppingCosts,0,x,target);
return res;
}
public void dfs(int[] toppingCosts,int idx,int cur,int target)
{
if(cur-target>Math.abs(res-target)) return; //如果当前成本已经高于最优方案时 因为再继续成本只会只增不减 所以结束回溯
if(Math.abs(cur-target)<Math.abs(res-target)) res=cur; //如果当前方案与目标差值<最优方案时
if(Math.abs(cur-target)==Math.abs(res-target)) res=Math.min(res,cur); //如果当前方案与目标差值=最优方案时 替换成成本更低的
if(idx>=toppingCosts.length) return; //如果上面都没返回 说明cur < target 如果配料用完了 则返回
dfs(toppingCosts,idx+1,cur,target); //1、什么配料都不加
dfs(toppingCosts,idx+1,cur+toppingCosts[idx],target); //2、加1份配料
dfs(toppingCosts,idx+1,cur+toppingCosts[idx]*2,target); //3、加2份配料
}
}