第一题就是组合问题,先求出数组总和的一半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]; } }
点赞 评论

相关推荐

点赞 评论 收藏
转发

牛客热帖

牛客网
牛客企业服务