Maximizar el beneficio total de todas las personas.

Hay una estructura jerárquica en una organización. Se va a organizar una fiesta. No pueden venir a la fiesta dos subordinados inmediatos. Un beneficio está asociado con cada persona. Tienes que maximizar el beneficio total de todas las personas que vienen a la fiesta.
Estructura jerárquica 
En una organización jerárquica, todos los empleados (excepto el que está a la cabeza) son subordinados de algún otro empleado. 
Los empleados solo reportan directamente a su superior inmediato. Esto permite una estructura flexible y eficiente.
 

Para los propósitos de este problema, esta estructura puede imaginarse como un árbol, con cada empleado como su Node.
Ejemplos: 
 

Input: 
         15
       /   \
     10     12
    /  \   /  \
   26   4 7    9
Output: The Maximum Profit would be 15+12+26+9 = 62
The Parent 15 chooses sub-ordinate 12, 10 chooses 26 and 12 chooses 9.

Input:
        12
       / | \
      9 25 16
     /     / \
    13    13   9
Output: 12+25+13+13 = 63

Enfoque: 
Dado el beneficio de cada empleado, tenemos que encontrar la suma máxima tal que no se inviten dos empleados (Nodes) con el mismo superior (Padre). Esto se puede lograr si cada empleado selecciona al subordinado con la máxima contribución para ir. 
En el programa, la jerarquía de la empresa se implementa en forma de diccionario, siendo la clave una identificación de empleado única y los datos son una array de la forma [Beneficio asociado con este empleo, [Lista de subordinados inmediatos] ]. 
Para cada Empleado, el subordinado con la mayor ganancia asociada se suma a la ganancia total. Además, el Empleado a la cabeza siempre está invitado.
 

C++

// C++ program for above approach
#include <bits/stdc++.h>
using namespace std;
 
int getMaxProfit(vector<vector<int> > hier)
{
 
    // The head has no competition and therefore invited
    int totSum = hier[0][0];
    for (vector<int> i : hier) {
        vector<int> currentSuperior = i;
        int selectedSub = 0;
 
        // Select the subordinate with maximum
        // value of each superior
        for (int j = 1; j < currentSuperior.size(); j++) {
            int e = currentSuperior[j];
            if (hier[e - 1][0] > selectedSub) {
                selectedSub = hier[e - 1][0];
            }
        }
 
        totSum += selectedSub;
    }
 
    return totSum;
}
 
// Driver Code
int main()
{
 
    // Define the Organization as a 2 - D array
    // Index : [Profit, List of Employees]
    /*
     Same as example 1 given above
              1:15
            /     \
          2:10    3:12
         /   \    /   \
       4:26 5:4 6:7  7:9
    */
 
    // Given input
    vector<vector<int> > organization
        = { { 15, 2, 3 }, { 10, 4, 5 }, { 12, 6, 7 },
            { 26 },       { 4 },        { 7 },
            { 9 } };
 
    // Function call
    int maxProfit = getMaxProfit(organization);
    cout << maxProfit << "\n";
 
    return 0;
}

Java

// Java program for above approach
class GFG {
    static int getMaxProfit(int[][] hier)
    {
 
        // The head has no competition and therefore invited
        int totSum = hier[0][0];
        for (int i = 0; i < hier.length; i++) {
            int selectedSub = 0;
            for (int j = 1; j < hier[i].length; j++) {
 
                int e = hier[i][j];
                if (hier[e - 1][0] > selectedSub) {
                    selectedSub = hier[e - 1][0];
                }
            }
            totSum += selectedSub;
        }
        return totSum;
    }
 
    public static void main(String[] args)
    {
        // Define the Organization as a 2 - D array
        // Index : [Profit, List of Employees]
        /*
         Same as example 1 given above
                  1:15
                /     \
              2:10    3:12
             /   \    /   \
           4:26 5:4 6:7  7:9
        */
 
        // Given input
        int[][] organization
            = { { 15, 2, 3 }, { 10, 4, 5 }, { 12, 6, 7 },
                { 26 },       { 4 },        { 7 },
                { 9 } };
 
        // Function call
        int maxProfit = getMaxProfit(organization);
        System.out.println(maxProfit);
    }
}
 
// This code is contributed by rajsanghavi9.

Python3

# Python program for above approach
 
 
def getMaxProfit(hier):
    # The head has no competition and therefore invited
    totSum = hier[1][0]
    for i in hier:
        currentSuperior = hier[i]
        selectedSub = 0
        # select the subordinate with maximum
        # value of each superior
        for j in currentSuperior[1]:
            if(hier[j][0] > selectedSub):
                selectedSub = hier[j][0]
        totSum += selectedSub
    return totSum
 
# driver function
 
 
def main():
    # Define the Organization as a Dictionary
    # Index : [Profit, List of Employees]
        # Same as example 1 given above
    # 1:15
    #       /     \
    # 2:10    3:12
    #    /   \    /   \
    # 4:26 5:4 6:7  7:9
 
    organization = {1: [15, [2, 3]],
                    2: [10, [4, 5]], 3: [12, [6, 7]],
                    4: [26, []], 5: [4, []], 6: [7, []], 7: [9, []]}
    maxProfit = getMaxProfit(organization)
    print(maxProfit)
 
 
main()
Producción: 

62

 

Complejidad temporal: O(N)
Espacio auxiliar: O(N) 

Publicación traducida automáticamente

Artículo escrito por joshi_arihant 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 *