You are given an integer array numsβββ and an integer k. You are asked to distribute this array into k subsets of equal size such that there are no two equal elements in the same subset.
A subset's incompatibility is the difference between the maximum and minimum elements in that array.
Return the minimum possible sum of incompatibilities of the ksubsets after distributing the array optimally, or return -1 if it is not possible.
A subset is a group integers that appear in the array with no particular order.
Example 1:
Input: nums = [1,2,1,4], k = 2
Output: 4
Explanation: The optimal distribution of subsets is [1,2] and [1,4].
The incompatibility is (2-1) + (4-1) = 4.
Note that [1,1] and [2,4] would result in a smaller sum, but the first subset contains 2 equal elements.
Example 2:
Input: nums = [6,3,8,1,3,1,2,2], k = 4
Output: 6
Explanation: The optimal distribution of subsets is [1,2], [2,3], [6,8], and [1,3].
The incompatibility is (2-1) + (3-2) + (8-6) + (3-1) = 6.
Example 3:
Input: nums = [5,3,3,6,3,3], k = 3
Output: -1
Explanation: It is impossible to distribute nums into 3 subsets where no two elements are equal in the same subset.
Constraints:
1 <= k <= nums.length <= 16
nums.length is divisible by k
1 <= nums[i] <= nums.length
Solutions
Solution 1: Preprocessing + State Compression + Dynamic Programming
Let's assume that the size of each subset after partitioning is \(m\), so \(m=\frac{n}{k}\), where \(n\) is the length of the array.
We can enumerate all subsets \(i\), where \(i \in [0, 2^n)\), if the binary representation of subset \(i\) has \(m\) ones, and the elements in subset \(i\) are not repeated, then we can calculate the incompatibility of subset \(i\), denoted as \(g[i]\), i.e., \(g[i]=\max_{j \in i} \{nums[j]\} - \min_{j \in i} \{nums[j]\}\).
Next, we can use dynamic programming to solve.
We define \(f[i]\) as the minimum sum of incompatibilities when the current partitioned subset state is \(i\). Initially, \(f[0]=0\), which means no elements are partitioned into the subset, and the rest \(f[i]=+\infty\).
For state \(i\), we find all undivided and non-repeated elements, represented by a state \(mask\). If the number of elements in state \(mask\) is greater than or equal to \(m\), then we enumerate all subsets \(j\) of \(mask\), and satisfy \(j \subset mask\), then \(f[i \cup j]=\min \{f[i \cup j], f[i]+g[j]\}\).
Finally, if \(f[2^n-1]=+\infty\), it means that it cannot be partitioned into \(k\) subsets, return \(-1\), otherwise return \(f[2^n-1]\).
The time complexity is \(O(3^n)\), and the space complexity is \(O(2^n)\). Here, \(n\) is the length of the array.