Advertisement
_no0B

Untitled

Nov 7th, 2021
775
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.05 KB | None | 0 0
  1. /// problem: https://leetcode.com/problems/partition-to-k-equal-sum-subsets/
  2.  
  3. class Solution {
  4. public:
  5.  
  6.     int dpp[2+(1<<16)] , sum[2+(1<<16)];
  7.  
  8.     void init(vector<int>& nums){
  9.         int tot = nums.size();
  10.         for(int mask = 0 ; mask < (1<<tot) ; mask++){
  11.             for(int i = 0 ; i < tot ; i++){
  12.                 if(mask & (1<<i)) sum[mask] += nums[i];
  13.             }
  14.         }
  15.     }
  16.  
  17.     bool solve(vector<int>& nums , int mask, int cons)
  18.     {
  19.         if(dpp[mask] != -1) return dpp[mask];
  20.         if(mask == 0) return 1;
  21.         bool ans = 0;
  22.         for(int sub = mask ; sub > 0 ; sub = (sub-1)&mask){
  23.             if(sum[sub] == cons){
  24.                 ans |= solve(nums , mask ^ sub , cons);
  25.             }
  26.         }
  27.         return dpp[mask] = ans;
  28.     }
  29.  
  30.     bool canPartitionKSubsets(vector<int>& nums, int k) {
  31.         int sum = 0;
  32.         for(int a:nums) sum += a;
  33.         sum /= k;
  34.         init(nums);
  35.         memset(dpp,-1,sizeof dpp);
  36.         int tot = nums.size();
  37.         return solve(nums,(1<<tot) - 1,sum);
  38.     }
  39. };
  40.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement