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
| class Solution { public: bool canPartitionKSubsets(vector<int>& nums, int k) { int sum = accumulate(nums.begin(), nums.end(), 0); if (sum % k != 0) return false; int target = sum / k; sort(nums.begin(), nums.end(), greater<int>()); if (nums[0] > target) return false; int n = nums.size(); vector<bool> v(n); return dfs(target, nums, 0, v, k, target); }
bool dfs(int s, const vector<int> &A, int b, vector<bool> &v, int k, int target) { if (k == 0) return true; if (s < 0) return false; if (s == 0) return dfs(target, A, 0, v, k - 1, target); for (int i = b; i < A.size(); ++i) { if (v[i]) continue; v[i] = true; if (dfs(s - A[i], A, i + 1, v, k, target)) return true; v[i] = false; } return false; } };
|