题解 | 划分等和序列

划分等和序列

https://www.nowcoder.com/practice/89ceab10d36140ce8f0d38c56e417f02

class Solution {
public:
    vector<int> used;  //记忆数组,记录已经使用过的元素;
    bool candivide(vector<int>& nums, int k) {
        used.resize(nums.size(), 0);  //0表示没有被使用过

        int all = 0;
        for(int i:nums)all += i;
        if( all % k ) return false;  //每组目标不是整数false;
        int target = all / k;   

        //方便进行剪枝,大的在前,递归次数少(先满足),同时递归时跳过相同的不能采用的元素;
        sort(nums.rbegin(), nums.rend());  
        if(nums[0] > target)return false; //一个元素大于target,false

        return solution(nums, 0, 0, k, target);
    }

    bool solution(vector<int>& nums, int start, int cur_sum, int k, int target){
        if(k == 0) return true;   //最终目的
        if(cur_sum == target) return solution(nums, 0, 0, k-1, target);

        for(int i = 0; i<nums.size(); ++i){
            if(used[i] || cur_sum + nums[i] > target)
                continue;

            used[i] = 1;
            if(solution(nums, i, cur_sum+nums[i], k, target))return true;  //采用
            used[i] = 0;   //退回

            while(i+1<nums.size() && nums[i] == nums[i+1])i++;  //剪枝
        }

        return false;
    }
};

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-24 20:25
腾讯今年实习招了这么多人,后面秋招还会招人吗??想着秋招再战来着
牛客965593684号:腾讯好像2020年之后就是实习生招得多,应届生基本上不招,纯实习转正
点赞 评论 收藏
分享
明天不下雨了_人机版:让我们大声的说出来:以前的未来就是现在
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务