可以利用dfs求得,dfs需要进行剪枝
    这个分成4分,dfs的工作就是要知道每一个数字放在哪一部分呢?
    image.png

    1. class Solution {
    2. vector<int> partition;
    3. int target;
    4. vector<int> nums;
    5. bool dfs(int idx)
    6. {
    7. if(idx == nums.size())
    8. {
    9. return (partition[0] == partition[1] && partition[1] == partition[2] && partition[2] == partition[3]);
    10. }
    11. for(int i = 0; i < 4; i++)
    12. {
    13. if(partition[i] + nums[idx] > target)
    14. continue;
    15. partition[i] += nums[idx];
    16. if(dfs(idx + 1))
    17. return true;
    18. partition[i] -= nums[idx];
    19. }
    20. return false;
    21. }
    22. public:
    23. bool makesquare(vector<int>& _nums) {
    24. nums = _nums;
    25. int sum = 0;
    26. if(nums.size() < 4)
    27. return false;
    28. for(auto x: nums)
    29. sum += x;
    30. if(sum % 4 != 0)
    31. return false;
    32. target = sum / 4;
    33. sort(nums.begin(), nums.end(),greater<int>());
    34. partition = vector<int>(4, 0);
    35. return dfs(0);
    36. }
    37. };

    第二次写题

    class Solution {
        // vector<vector<int>> aGroup;
        vector<int> aSum;
        int iPart;
        bool fcDfs(vector<int>& nums, int idx)
        {
            if(idx == nums.size())
            {
                for(int k = 0; k < 4; k++)
                {
                    if(aSum[k] != iPart) return false;
                }
                return true;
            }
            for(int k = 0; k < 4; k++)
            {
                if(aSum[k] >= iPart) continue;
                if(aSum[k] + nums[idx] > iPart) continue;
                // aGroup[k].push_back(nums[idx]);
                aSum[k] += nums[idx];
                if(fcDfs(nums, idx + 1)) return true;
                // aGroup[k].pop_back();
                aSum[k] -= nums[idx];
            }
            return false;
        }
    
    public:
        bool makesquare(vector<int>& nums) {
            if(nums.size() < 4) return false;
    
            // aGroup = vector<vector<int>>(4, vector<int>());
            aSum = vector<int>(4, 0);
            int iSum = 0;
            for(int i = 0; i < nums.size(); i++)
            {
                iSum += nums[i];
            }
            if(iSum % 4 != 0) return false;
            iPart = iSum/4;
            sort(nums.begin(), nums.end(), greater<int>());//如果是从小到大会超时
            return fcDfs(nums, 0);
        }
    };