第一题就是组合问题,先求出数组总和的一半target 再dfs看有没有最接近target的组合,有就更新。 void two_can(vector<int>& nums, vector<bool>& used,int start, int sum,double target,vector<int>& track,int& ans) {     if(sum > ans) return; //超过之前较优解ans,剪枝     if(sum >= target)     //满足 >= target 且小于之前较优解 ans,进来更新较优解ans     {         ans = sum;        //最后ans就是答案         res.push_back(track);         return;     }     for(int i = start; i <nums.size();i++)     {         if(i > 0 && nums[i] == nums[i-1] && !used[i-1]) continue;//跳过重复元素         sum += nums[i];         track.push_back(nums[i]);         used[i] = true;         two_can(nums,used,i+1,sum,target,track,ans);         used[i] = false;         track.pop_back();         sum -= nums[i];     } }