import
java.util.*;
public
class
GFG {
static
boolean
canPartition(List<Integer> nums,
List<List<Integer> > groups,
List<Integer> groupSum,
int
targetSum,
int
currIdx,
int
k)
{
if
(currIdx == nums.size()) {
for
(
int
sum : groupSum) {
if
(sum != targetSum)
return
false
;
}
return
true
;
}
for
(
int
i =
0
; i < k; ++i) {
if
(groupSum.get(i) + nums.get(currIdx)
<= targetSum) {
groups.get(i).add(nums.get(currIdx));
groupSum.set(i, groupSum.get(i)
+ nums.get(currIdx));
if
(canPartition(nums, groups, groupSum,
targetSum, currIdx +
1
, k))
return
true
;
groups.get(i).remove(groups.get(i).size()
-
1
);
groupSum.set(i, groupSum.get(i)
- nums.get(currIdx));
}
}
return
false
;
}
static
List<List<Integer> >
distributeElements(
int
n,
int
k, List<Integer> elements)
{
int
totalSum = elements.stream()
.mapToInt(Integer::intValue)
.sum();
int
targetSum = totalSum / k;
if
(totalSum % k !=
0
)
return
new
ArrayList<>();
List<List<Integer> > groups =
new
ArrayList<>();
for
(
int
i =
0
; i < k; i++) {
groups.add(
new
ArrayList<>());
}
List<Integer> groupSum
=
new
ArrayList<>(Collections.nCopies(k,
0
));
boolean
possible = canPartition(
elements, groups, groupSum, targetSum,
0
, k);
if
(!possible)
return
new
ArrayList<>();
return
groups;
}
public
static
void
main(String[] args)
{
int
n =
5
;
int
k =
2
;
List<Integer> elements
= Arrays.asList(
7
,
5
,
8
,
5
,
5
);
int
minVal = n, maxVal =
0
;
List<List<Integer> > groups
= distributeElements(n, k, elements);
if
(groups.isEmpty()) {
System.out.println(
"-1"
);
}
else
{
for
(List<Integer> group : groups) {
minVal = Math.min(minVal, group.size());
maxVal = Math.max(maxVal, group.size());
}
System.out.println(minVal +
" "
+ maxVal);
}
}
}