3
unordered_map<string, int> dp;4
int solve(vector<int> &nums, int target, int remain, int i, int vis, int k) {7
// memorization addition8
string t = to_string(i) + "_" + to_string(remain) + "_" + to_string(k) + "_" + to_string(vis);9
if (dp.find(t) != dp.end()) return dp[t];12
return dp[t] = solve(nums, target, target, nums.size() - 1, vis, k - 1);14
for (int j = i; j >= 0; --j) {15
if (((vis >> j) & 1) || remain - nums[j] < 0) continue;17
if (solve(nums, target, remain - nums[j], j - 1, vis, k)) return dp[t] = 1;18
vis = vis & ~(1 << j);22
bool canPartitionKSubsets(vector<int> &nums, int k) {23
int sum = accumulate(nums.begin(), nums.end(), 0);24
if (sum % k != 0) return false;26
return solve(nums, sum / k, sum / k, nums.size() - 1, vis, k);