思路:DFS暴力
今天就不整动态规划了,脑子有点用不过来了。
这个题其实暴搜就行了,在暴搜之前,首先定下来初值,也就是冰淇凌的基地,我们一个一个遍历就行了,然后挨个暴搜
这个DFS的类型是指数型递归,也就是选和不选的那种类型,但这里题型变了一下,无非就是多了一种选择。
选择有三个:不选,选一次,选两次。
注意:在判断dfs条件的时候,u>top.size()-1这一条一定是最后判定才可以,不能打乱顺序,因为我们在遍历到u-1,之后再往后遍历就是u了,但是这个时候数值sum才加到top[u-1],也就是还在可控范围之内的边界,不能一下子就停了,如果放在开头,就会误判,少了最后边界数值的判断。需要在我们迭代完res这个变量之后再停止后面的遍历,这样才行。
还有,大家可能也发现了,为什么我没有写sum>=target的时候停止呢?因为没有必要,我们可以举个例子,假如target=10,你算出来有两个接近target的数8和10,我们倾向于选择成本小的那个一个。所以我在前面已经写出了在这种可能性下的选择,这样的话sum>=target显然多余了,没有必要加进去,因为数值10也是被允许的,也是可以和别的数值进行比较的,这样还是比较安全。
class Solution {
public:
int res=0x3f3f3f;
void dfs(int u,int sum,vector<int>&top,int target){if(abs(res-target)>abs(sum-target))res=sum;if(abs(res-target)==abs(sum-target))res=min(sum,res);if(u>top.size()-1)return;dfs(u+1,sum,top,target);dfs(u+1,sum+top[u],top,target);dfs(u+1,sum+2*top[u],top,target);}int closestCost(vector<int>& baseCosts, vector<int>& toppingCosts, int target) {for(int init:baseCosts){dfs(0,init,toppingCosts,target);}return res;}
};