Part1:题目描述
Given an array of integers nums
and a positive integer k
,
find whether it's possible to divide this array into k
non-empty subsets whose sums are all equal.
Example 1:
Input: nums = [4, 3, 2, 3, 5, 2, 1], k = 4 Output: True Explanation: It's possible to divide it into 4 subsets (5), (1, 4), (2,3), (2,3) with equal sums.
Note:
-
1 <= k <= len(nums) <= 16
. -
0 < nums[i] < 10000
.
Part2:解题思路
这一题我觉得对我来说还是挺难的,借鉴了leetcode上面的解法才得以解决,要再更深入的理解才行
Part3:代码
class Solution { public: bool search(vector<int>groups, int row, vector<int>& nums, int target) { if (row < 0) return true; // 执行完这一句之后row的值才会变 int v = nums[row--]; for (int i = 0; i < groups.size(); i++) { if (groups[i] + v <= target) { groups[i] += v; if (search(groups, row, nums, target)) return true; groups[i] -= v; } if (groups[i] == 0) break; } return false; } bool canPartitionKSubsets(vector<int>& nums, int k) { int length = nums.size(); int sum = 0; for (int i = 0; i < length; i++) { sum += nums[i]; } if ((sum % k) != 0) return false; int target = sum / k; sort(nums.begin(), nums.end()); int row = length - 1; if(nums[row] > target) return false; while (row >= 0 && nums[row] == target) { row--; k--; } return search(vector<int>(k), row, nums, target); } };