Bitmask DP
Time O(2ⁿ × n) Space O(2ⁿ)dp[mask] = current bucket fill or −1 if unreachable. From a reachable mask, add any unused item that fits; the new fill is (fill + x) mod target.
import java.util.Arrays;
class Solution {
public boolean canPartitionKSubsets(int[] nums, int k) {
int sum = 0;
for (int x : nums) sum += x;
if (sum % k != 0) return false;
int target = sum / k, n = nums.length;
int[] dp = new int[1 << n];
Arrays.fill(dp, -1);
dp[0] = 0;
for (int mask = 0; mask < (1 << n); mask++) {
if (dp[mask] < 0) continue;
for (int i = 0; i < n; i++) {
if (((mask >> i) & 1) == 1 || dp[mask] + nums[i] > target) continue;
dp[mask | (1 << i)] = (dp[mask] + nums[i]) % target;
}
}
return dp[(1 << n) - 1] == 0;
}
}Verdict: Reliable within the limits.