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;
    }
};



posted @ 2026-01-07 17:18  katago  阅读(21)  评论(0)    收藏  举报