思路: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;}
};