A group of ninjas want to play a game of tag but they can only do that if each team has the same average strength of abilities among the two divided teams. You are given a list (array named ‘strengths’) of the strengths of the group of ninjas represented by numbers (integers). You have to determine whether those ninjas can be regrouped into two different teams such that the average strength of the two teams formed is equal.
Note:You have to move each ninja of given strength from the given list into two separate teams (list) ‘Team_A’ and ‘Team_B’ such that the average strengths of ‘Team_A’ == ‘Team_B’. There has to be at least one member in each team since they cannot play the game without that.
For Example:
Input : [1, 7, 15, 29, 11, 9]
Output : [9, 15] [1, 7, 11, 29]
Explanation: The average strengths of both the teams is 12
The first line of input contains a single integer ‘N’ denoting the number of ninjas, whose list of strengths which would be given in the list.
The second line contains ‘N’ single space-separated integers, denoting the strengths of the ninjas.
Output Format :
Print "True" if the ninjas can be regrouped into two different teams having same average strengths and "False" is they cannot be regrouped.
Note:
You do not need to print anything, it has already been taken care of. Just implement the given function.
1 <= N <= 30
0 <= strengths[i] <= 10^4
Time Limit: 1 sec
8
1 2 3 4 5 6 7 8
True
We can split the array into [1, 4, 5, 8] and [2, 3, 6, 7], and both of them have an average of 4.5.
2
3 1
False
We cannot split the array into two parts as all the combinations would not have same average in both parts.
Check how the problem can be simplified into the ‘N-sum problem’ or the ‘Knapsack problem’ implemented using dynamic programming.
The idea here is that for each element you have 2 options (like in a Knapsack problem), select the ninja member in B or A. The sum of strengths of ninjas in team B is the sum of numbers in B and n is the number of elements in B. The states can’t be uniquely classified by just ‘i’ and sum because you can obtain the same sum value by selecting a different number of elements, which will affect the average.
Assume we split the total ninjas (let list (array) ‘strengths’ denote the list of strengths of the total ninjas given to us) into ‘A’ and ‘B’ so that avg(A) == avg(B).
Notice a fact that in this problem we have: avg(strengths) == avg(A) == avg(B)
So we only need to find a proper subset B such that avg(B) == avg(strengths) and we can just put the remaining elements in A.
Now if avg(B)==avg(strengths), that means sum(B) / B.length == sum(strengths) / N
or, sum(B) == sum(strenghts) * B.length / N
That means we need to find a subset B, such that its sum and length satisfies this condition.
The algorithm will be:
O(N^2 * SUM), where N denotes the number of elements in the list and ‘SUM’ is the sum of the array.
We are initialising a 3D array and may have to calculate all the possible outcomes whether the selected subsets would result into a sum that we require. Thus, the time complexity due to it will be O(N^2 * SUM).
O(N^2 * SUM), where N denotes the number of elements in the list and ‘SUM’ is the sum of the array.
We are using a 3D array of size (N^2 * SUM) to store the all the possible outcomes possible which is possible and can be required during recursion. Thus, the space complexity due to the array/list will be O(N^2 * SUM).