classSolution { public: vector<int> dp; int n, avg;
boolcanPartitionKSubsets(vector<int>& nums, int k){ int sum = reduce(nums.begin(), nums.end(), 0); if (sum % k) { returnfalse; } avg = sum / k; ranges::sort(nums); if (nums.back() > avg) { returnfalse; } n = nums.size(); dp.resize(1 << n, -1); int res = dfs(0, 0, nums); return res; }
booldfs(int state, int sum, vector<int>& nums){ if (state == (1 << n) - 1) { returntrue; } if (dp[state] != -1) { return dp[state]; } dp[state] = 0; for (int i = 0; i < n; i++) { if (nums[i] + sum > avg) { break; } if ((state & (1 << i)) == 0) { if (dfs(state | (1 << i), (sum + nums[i]) % avg, nums)) { dp[state] = 1; return1; } } } dp[state] = 0; return0; } };