1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| class Solution { public: bool canPartitionKSubsets(vector<int>& nums, int k) { auto sum = accumulate(nums.begin(), nums.end(), 0); if(sum % k != 0) return false; sum /= k; sort(nums.begin(), nums.end(), greater<int>()); vector<int> buckets(k); return helper(nums, buckets, 0, 0, sum, k - 1); }
private: unordered_map<int, bool> memo; bool helper(vector<int> &nums, vector<int> &buckets, int visited, int index, int target, int cur_level) { if(cur_level < 0) return true; if(buckets[cur_level] == target) { auto r = helper(nums, buckets, visited, 0, target, cur_level - 1); memo.emplace(visited, r); return r; } if(memo.count(visited)) return memo.at(visited); for(int i = index; i < nums.size(); ++i) { if((1 << i) & visited) continue; if(buckets[cur_level] + nums[i] > target) continue; buckets[cur_level] += nums[i]; visited ^= 1 << i; if(helper(nums, buckets, visited, i + 1, target, cur_level)) return true; buckets[cur_level] -= nums[i]; visited ^= 1 << i; if(i < nums.size() - 1 && nums[i] == nums[i + 1]) ++i; } return false; }
};
|