# Sum of average of all subsets

• Difficulty Level : Hard
• Last Updated : 13 May, 2021

Given an array arr of N integer elements, the task is to find the sum of the average of all subsets of this array.

Example:

```Input  : arr[] = [2, 3, 5]
Output : 23.33
Explanation : Subsets with their average are,
        average = 2/1 = 2
        average = 3/1 = 3
        average = 5/1 = 5
[2, 3]        average = (2+3)/2 = 2.5
[2, 5]        average = (2+5)/2 = 3.5
[3, 5]        average = (3+5)/2 = 4
[2, 3, 5]    average = (2+3+5)/3 = 3.33

Sum of average of all subset is,
2 + 3 + 5 + 2.5 + 3.5 + 4 + 3.33 = 23.33 ```

A naive solution is to iterate through all possible subsets, get an average of all of them and then add them one by one, but this will take exponential time and will be infeasible for bigger arrays.
We can get a pattern by taking an example,

```arr = [a0, a1, a2, a3]
sum of average =
a0/1 + a1/1 + a2/2 + a3/1 +
(a0+a1)/2 + (a0+a2)/2 + (a0+a3)/2 + (a1+a2)/2 +
(a1+a3)/2 + (a2+a3)/2 +
(a0+a1+a2)/3 + (a0+a2+a3)/3 + (a0+a1+a3)/3 +
(a1+a2+a3)/3 +
(a0+a1+a2+a3)/4

If S = (a0+a1+a2+a3), then above expression
can be rearranged as below,
sum of average = (S)/1 + (3*S)/2 + (3*S)/3 + (S)/4```

The coefficient with numerators can be explained as follows, suppose we are iterating over subsets with K elements then denominator will be K and the numerator will be r*S, where ‘r’ denotes the number of times a particular array element will be added while iterating over subsets of the same size. By inspection, we can see that r will be nCr(N – 1, n – 1) because after placing one element in summation, we need to choose (n – 1) elements from (N – 1) elements, so each element will have a frequency of nCr(N – 1, n – 1) while considering subsets of the same size, as all elements are taking part in summation equal number of times, this will the frequency of S also and will be the numerator in the final expression.
In the below code nCr is implemented using dynamic programming method, you can read more about that here,

## C++

 `// C++ program to get sum of average of all subsets``#include ``using` `namespace` `std;` `// Returns value of Binomial Coefficient C(n, k)``int` `nCr(``int` `n, ``int` `k)``{``    ``int` `C[n + 1][k + 1];``    ``int` `i, j;` `    ``// Calculate value of Binomial Coefficient in bottom``    ``// up manner``    ``for` `(i = 0; i <= n; i++) {``        ``for` `(j = 0; j <= min(i, k); j++) {``            ``// Base Cases``            ``if` `(j == 0 || j == i)``                ``C[i][j] = 1;` `            ``// Calculate value using previously stored``            ``// values``            ``else``                ``C[i][j] = C[i - 1][j - 1] + C[i - 1][j];``        ``}``    ``}``    ``return` `C[n][k];``}` `// method returns sum of average of all subsets``double` `resultOfAllSubsets(``int` `arr[], ``int` `N)``{``    ``double` `result = 0.0; ``// Initialize result` `    ``// Find sum of elements``    ``int` `sum = 0;``    ``for` `(``int` `i = 0; i < N; i++)``        ``sum += arr[i];` `    ``// looping once for all subset of same size``    ``for` `(``int` `n = 1; n <= N; n++)` `        ``/* each element occurs nCr(N-1, n-1) times while``           ``considering subset of size n  */``        ``result += (``double``)(sum * (nCr(N - 1, n - 1))) / n;` `    ``return` `result;``}` `// Driver code to test above methods``int` `main()``{``    ``int` `arr[] = { 2, 3, 5, 7 };``    ``int` `N = ``sizeof``(arr) / ``sizeof``(``int``);``    ``cout << resultOfAllSubsets(arr, N) << endl;``    ``return` `0;``}`

## Java

 `// java program to get sum of``// average of all subsets``import` `java.io.*;` `class` `GFG {` `    ``// Returns value of Binomial``    ``// Coefficient C(n, k)``    ``static` `int` `nCr(``int` `n, ``int` `k)``    ``{``        ``int` `C[][] = ``new` `int``[n + ``1``][k + ``1``];``        ``int` `i, j;` `        ``// Calculate value of Binomial``        ``// Coefficient in bottom up manner``        ``for` `(i = ``0``; i <= n; i++) {``            ``for` `(j = ``0``; j <= Math.min(i, k); j++) {``                ``// Base Cases``                ``if` `(j == ``0` `|| j == i)``                    ``C[i][j] = ``1``;` `                ``// Calculate value using``                ``// previously stored values``                ``else``                    ``C[i][j] = C[i - ``1``][j - ``1``] + C[i - ``1``][j];``            ``}``        ``}``        ``return` `C[n][k];``    ``}` `    ``// method returns sum of average of all subsets``    ``static` `double` `resultOfAllSubsets(``int` `arr[], ``int` `N)``    ``{``        ``// Initialize result``        ``double` `result = ``0.0``;` `        ``// Find sum of elements``        ``int` `sum = ``0``;``        ``for` `(``int` `i = ``0``; i < N; i++)``            ``sum += arr[i];` `        ``// looping once for all subset of same size``        ``for` `(``int` `n = ``1``; n <= N; n++)` `            ``/* each element occurs nCr(N-1, n-1) times while``            ``considering subset of size n */``            ``result += (``double``)(sum * (nCr(N - ``1``, n - ``1``))) / n;` `        ``return` `result;``    ``}` `    ``// Driver code to test above methods``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int` `arr[] = { ``2``, ``3``, ``5``, ``7` `};``        ``int` `N = arr.length;``        ``System.out.println(resultOfAllSubsets(arr, N));``    ``}``}` `// This code is contributed by vt_m`

## Python3

 `# Python3 program to get sum``# of average of all subsets` `# Returns value of Binomial``# Coefficient C(n, k)``def` `nCr(n, k):` `    ``C ``=` `[[``0` `for` `i ``in` `range``(k ``+` `1``)]``            ``for` `j ``in` `range``(n ``+` `1``)]` `    ``# Calculate value of Binomial``    ``# Coefficient in bottom up manner``    ``for` `i ``in` `range``(n ``+` `1``):``    ` `        ``for` `j ``in` `range``(``min``(i, k) ``+` `1``):``        ` `            ``# Base Cases``            ``if` `(j ``=``=` `0` `or` `j ``=``=` `i):``                ``C[i][j] ``=` `1` `            ``# Calculate value using``            ``# previously stored values``            ``else``:``                ``C[i][j] ``=` `C[i``-``1``][j``-``1``] ``+` `C[i``-``1``][j]``    ` `    ``return` `C[n][k]` `# Method returns sum of``# average of all subsets``def` `resultOfAllSubsets(arr, N):` `    ``result ``=` `0.0` `# Initialize result` `    ``# Find sum of elements``    ``sum` `=` `0``    ``for` `i ``in` `range``(N):``        ``sum` `+``=` `arr[i]` `    ``# looping once for all subset of same size``    ``for` `n ``in` `range``(``1``, N ``+` `1``):` `        ``# each element occurs nCr(N-1, n-1) times while``        ``# considering subset of size n */``        ``result ``+``=` `(``sum` `*` `(nCr(N ``-` `1``, n ``-` `1``))) ``/` `n` `    ``return` `result` `# Driver code``arr ``=` `[``2``, ``3``, ``5``, ``7``]``N ``=` `len``(arr)``print``(resultOfAllSubsets(arr, N))`  `# This code is contributed by Anant Agarwal.`

## C#

 `// C# program to get sum of``// average of all subsets``using` `System;` `class` `GFG {``    ` `    ``// Returns value of Binomial``    ``// Coefficient C(n, k)``    ``static` `int` `nCr(``int` `n, ``int` `k)``    ``{``        ``int``[, ] C = ``new` `int``[n + 1, k + 1];``        ``int` `i, j;` `        ``// Calculate value of Binomial``        ``// Coefficient in bottom up manner``        ``for` `(i = 0; i <= n; i++) {``            ``for` `(j = 0; j <= Math.Min(i, k); j++)``            ``{``                ``// Base Cases``                ``if` `(j == 0 || j == i)``                    ``C[i, j] = 1;` `                ``// Calculate value using``                ``// previously stored values``                ``else``                    ``C[i, j] = C[i - 1, j - 1] + C[i - 1, j];``            ``}``        ``}``        ``return` `C[n, k];``    ``}` `    ``// method returns sum of average``    ``// of all subsets``    ``static` `double` `resultOfAllSubsets(``int``[] arr, ``int` `N)``    ``{``        ``// Initialize result``        ``double` `result = 0.0;` `        ``// Find sum of elements``        ``int` `sum = 0;``        ``for` `(``int` `i = 0; i < N; i++)``            ``sum += arr[i];` `        ``// looping once for all subset``        ``// of same size``        ``for` `(``int` `n = 1; n <= N; n++)` `            ``/* each element occurs nCr(N-1, n-1) times while``               ``considering subset of size n */``            ``result += (``double``)(sum * (nCr(N - 1, n - 1))) / n;` `        ``return` `result;``    ``}` `    ``// Driver code to test above methods``    ``public` `static` `void` `Main()``    ``{``        ``int``[] arr = { 2, 3, 5, 7 };``        ``int` `N = arr.Length;``        ``Console.WriteLine(resultOfAllSubsets(arr, N));``    ``}``}` `// This code is contributed by Sam007`

## PHP

 ``

## Javascript

 ``

Output :

`63.75`

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.