leetcode [698] 划分为k个相等的子集
https://leetcode.cn/problems/partition-to-k-equal-sum-subsets/description/
和拼火柴一样, 改为k个集合
/*
* @lc app=leetcode.cn id=698 lang=cpp
*
* [698] 划分为k个相等的子集
*/
// @lc code=start
class Solution {
public:
int dp[1 << 16];
int n;
bool canPartitionKSubsets(vector<int>& nums, int k) {
n = nums.size();
int sum = 0;
for (int num : nums) sum += num;
if (sum % k != 0) return false;
int target = sum / k;
sort(nums.begin(), nums.end(), greater<int>());
memset(dp, -1, sizeof(dp));
return dfs(0, 0, k, target, nums);
}
bool dfs(int status, int cur, int rest, int target, vector<int>& nums) {
if (rest == 0) return true;
if (dp[status] != -1) return dp[status];
for (int i = 0; i < n; i++) {
if ((status >> i) & 1) continue;
if (cur + nums[i] > target) continue;
int nstatus = status | (1 << i);
int nrest = rest;
int ncur = cur + nums[i];
if( ncur == target) {
nrest--;
ncur = 0;
}
if (dfs(nstatus, ncur, nrest, target, nums)) {
dp[status] = 1;
return true;
}
}
dp[status] = 0;
return false;
}
};

浙公网安备 33010602011771号