import
java.util.*;
public
class
GFG
{
public
static
int
MinimizeSum(List<Integer> nums,
int
k)
{
int
n = nums.size();
if
(k == n) {
return
0
;
}
int
inf = 1_000_000_000;
int
[][] dp =
new
int
[
1
<< n][n];
for
(
int
[] row : dp) {
java.util.Arrays.fill(row, inf);
}
Collections.sort(nums);
for
(
int
i =
0
; i < n; i++) {
dp[
1
<< i][i] =
0
;
}
for
(
int
mask =
0
; mask < (
1
<< n); mask++)
{
List<Integer> n_z_bits =
new
ArrayList<>();
for
(
int
i =
0
; i < n; i++) {
if
((mask >> i &
1
) ==
1
) {
n_z_bits.add(i);
}
}
if
(n_z_bits.size() % (n / k) ==
1
) {
for
(
int
i =
0
; i < n_z_bits.size(); i++) {
for
(
int
j = i +
1
; j < n_z_bits.size(); j++) {
int
temp = dp[mask ^ (
1
<< n_z_bits.get(j))][n_z_bits.get(i)];
dp[mask][n_z_bits.get(j)] = Math.min(dp[mask][n_z_bits.get(j)], temp);
}
}
}
else
{
for
(
int
i =
0
; i < n_z_bits.size(); i++) {
for
(
int
j = i +
1
; j < n_z_bits.size(); j++) {
if
(nums.get(n_z_bits.get(i)) != nums.get(n_z_bits.get(j)))
{
int
maskT = mask ^ (
1
<< n_z_bits.get(j));
int
temp = (dp[maskT][n_z_bits.get(i)] + nums.get(n_z_bits.get(i)) - nums.get(n_z_bits.get(j)));
dp[mask][n_z_bits.get(j)] = Math.min(dp[mask][n_z_bits.get(j)], temp);
}
}
}
}
}
int
minVal = inf;
for
(
int
i =
0
; i < n; i++) {
minVal = Math.min(minVal, dp[(
1
<< n) -
1
][i]);
}
if
(minVal == inf) {
return
-
1
;
}
else
{
return
999999999
- minVal;
}
}
public
static
void
main(String[] args) {
List<Integer> arr =
new
ArrayList<>();
arr.add(
6
);arr.add(
3
);arr.add(
8
);arr.add(
1
);
arr.add(
3
);arr.add(
1
);arr.add(
2
);arr.add(
2
);
int
k =
4
;
System.out.println(MinimizeSum(arr,k));
}
}