Suma del promedio de todos los subconjuntos

Dada una array arr de N elementos enteros, la tarea es encontrar la suma del promedio de todos los subconjuntos de esta array.

Ejemplo:  

Input  : arr[] = [2, 3, 5]
Output : 23.33 
Explanation : Subsets with their average are, 
[2]        average = 2/1 = 2
[3]        average = 3/1 = 3
[5]        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 

Una solución ingenua es iterar a través de todos los subconjuntos posibles, obtener un promedio de todos ellos y luego agregarlos uno por uno, pero esto llevará un tiempo exponencial y será inviable para arreglos más grandes. 
Podemos obtener un patrón tomando un ejemplo,  

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

El coeficiente con numeradores se puede explicar de la siguiente manera, supongamos que estamos iterando sobre subconjuntos con K elementos, entonces el denominador será K y el numerador será r*S, donde ‘r’ denota la cantidad de veces que se agregará un elemento de array en particular mientras iterando sobre subconjuntos del mismo tamaño. Por inspección, podemos ver que r será nCr(N – 1, n – 1) porque después de colocar un elemento en la suma, necesitamos elegir (n – 1) elementos de (N – 1) elementos, por lo que cada elemento será tienen una frecuencia de nCr(N – 1, n – 1) considerando subconjuntos del mismo tamaño, ya que todos los elementos participan en la suma el mismo número de veces, esta será la frecuencia de S también y será el numerador en el final expresión. 
En el siguiente código, nCr se implementa utilizando el método de programación dinámica, Puedes leer mas al respecto aquí, 
 

C++

// C++ program to get sum of average of all subsets
#include <bits/stdc++.h>
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

<?php
// PHP program to get sum
// of average of all subsets
 
// Returns value of Binomial
// Coefficient C(n, k)
function nCr($n, $k)
{
    $C[$n + 1][$k + 1] = 0;
    $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
function resultOfAllSubsets($arr, $N)
{
    // Initialize result
    $result = 0.0;
 
    // Find sum of elements
    $sum = 0;
    for ($i = 0; $i < $N; $i++)
        $sum += $arr[$i];
 
    // looping once for all
    // subset of same size
    for ($n = 1; $n <= $N; $n++)
 
        /* 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 = array( 2, 3, 5, 7 );
$N = sizeof($arr) / sizeof($arr[0]);
echo resultOfAllSubsets($arr, $N) ;
 
// This code is contributed by nitin mittal.
?>

Javascript

<script>
    // javascript program to get sum of
    // average of all subsets
     
    // Returns value of Binomial
    // Coefficient C(n, k)
    function nCr(n, k)
    {
        let C = new Array(n + 1);
        for (let i = 0; i <= n; i++)
        {
            C[i] = new Array(k + 1);
            for (let j = 0; j <= k; j++)
            {
                C[i][j] = 0;
            }
        }
        let 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
    function resultOfAllSubsets(arr, N)
    {
        // Initialize result
        let result = 0.0;
   
        // Find sum of elements
        let sum = 0;
        for (let i = 0; i < N; i++)
            sum += arr[i];
   
        // looping once for all subset of same size
        for (let n = 1; n <= N; n++)
   
            /* 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;
    }
     
    let arr = [ 2, 3, 5, 7 ];
    let N = arr.length;
    document.write(resultOfAllSubsets(arr, N));
     
</script>

Producción :  

63.75

Este artículo es una contribución de Utkarsh Trivedi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *