Valor máximo con la opción de dividir o considerar como es

Nos dan un número n, necesitamos encontrar la suma máxima posible con la ayuda de la siguiente función: 
F(n) = max( (F(n/2) + F(n/3) + F(n/4) + F(n/5)), n) . Para calcular F(n, ) podemos tener n como nuestro resultado o podemos dividir n en cuatro partes como en la definición de función dada. Esto se puede hacer todo el tiempo que podamos. Encuentre la suma máxima posible que puede obtener de un N dado. Nota: 1 no se puede dividir más, por lo que F (1) = 1 como caso base.

Ejemplos: 

Input : n = 10
Output : MaxSum = 12
Explanation: 
f(10) = f(10/2) + f(10/3) + f(10/4) + f(10/5)
      = f(5)  +   f(3)  +  f(2)   +  f(2)
      = 12
5, 3 and 2 cannot be further divided.

Input : n = 2
Output : MaxSum = 2

Enfoque: este problema se puede resolver con un enfoque recursivo, pero eso nos costará una gran complejidad debido a sus subproblemas superpuestos. Entonces aplicamos el concepto de programación dinámica para resolver esta pregunta de manera ascendente como:

C++

// CPP program for maximize result when
// we have choice to divide or consider
// as it is.
#include <bits/stdc++.h>
using namespace std;
 
// function for calculating max possible result
int maxDP(int n)
{
    int res[n + 1];
    res[0] = 0;
    res[1] = 1;
 
    // Compute remaining values in bottom
    // up manner.
    for (int i = 2; i <= n; i++)
        res[i] = max(i, (res[i / 2]
                         + res[i / 3]
                         + res[i / 4]
                         + res[i / 5]));
 
    return res[n];
}
 
// Driver Code
int main()
{
    int n = 60;
    cout << "MaxSum =" << maxDP(n);
    return 0;
}

Java

// Java program for maximize result when
// we have choice to divide or consider
// as it is.
import java.io.*;
 
class GFG {
 
    // function for calculating max
    // possible result
    static int maxDP(int n)
    {
        int res[] = new int[n + 1];
        res[0] = 0;
        res[1] = 1;
 
        // Compute remaining values in
        // bottom up manner.
        for (int i = 2; i <= n; i++)
            res[i]
                = Math.max(i, (res[i / 2]
                               + res[i / 3]
                               + res[i / 4]
                               + res[i / 5]));
 
        return res[n];
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        int n = 60;
        System.out.println("MaxSum = " + maxDP(n));
    }
}
 
// This code is contributed by vt_m

Python3

# Python3 code to maximize result when
# we have choice to divide or consider
# as it is.
 
# function for calculating max
# possible result
def maxDP (n):
    res = list()
    res.append(0)
    res.append(1)
     
    # Compute remaining values in
    # bottom up manner.
    i = 2
    while i<n + 1:
        res.append(max(i, (res[int(i / 2)]
                           + res[int(i / 3)] +
                             res[int(i / 4)]
                           + res[int(i / 5)])))
        i = i + 1
     
    return res[n]
 
# driver code
n = 60
print("MaxSum =", maxDP(n))
 
# This code is contributed by "Sharad_Bhardwaj".

C#

// C# program for maximize result when
// we have choice to divide or consider
// as it is.
using System;
 
class GFG {
 
    // function for calculating max
    // possible result
    static int maxDP(int n)
    {
        int[] res = new int[n + 1];
        res[0] = 0;
        res[1] = 1;
 
        // Compute remaining values in
        // bottom up manner.
        for (int i = 2; i <= n; i++)
            res[i] = Math.Max(i, (res[i / 2]
                                  + res[i / 3]
                                  + res[i / 4]
                                  + res[i / 5]));
 
        return res[n];
    }
 
    // Driver code
    public static void Main()
    {
        int n = 60;
        Console.WriteLine("MaxSum = " + maxDP(n));
    }
}
 
// This code is contributed by vt_m

PHP

<?php
 
// PHP program to maximize
// result when we have choice
// to divide or consider as it is.
 
// function for calculating
// max possible result
 
function maxDP ($n)
{
 
    $res[0] = 0;
    $res[1] = 1;
 
    // Compute remaining values 
    // in bottom up manner.
    for ($i = 2; $i <= $n; $i++)
    $res[$i] = max($i, ($res[$i / 2] +
                        $res[$i / 3] +
                        $res[$i / 4] +
                        $res[$i / 5]));
 
    return $res[$n];
}
 
// Driver Code
$n = 60;
echo "MaxSum =", maxDP ($n);
 
// This code is contributed by aj_36
?>

Javascript

<script>
 
// javascript program for maximize result when
// we have choice to divide or consider
// as it is.
 
    // function for calculating max
    // possible result
    function maxDP(n)
    {
        let res = [];
 
        res[0] = 0;
        res[1] = 1;
  
        // Compute remaining values in
        // bottom up manner.
        for (let i = 2; i <= n; i++){
            res[i]
                = Math.max(i, (res[Math.floor(i / 2)]
                               + res[Math.floor(i / 3)]
                               + res[Math.floor(i / 4)]
                               + res[Math.floor(i / 5)]));
          }
  
        return res[n];
    }
 
// Driver code
 
    let n = 60;
    document.write("MaxSum = " + maxDP(n));
     
</script>
Producción

MaxSum =106

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

Publicación traducida automáticamente

Artículo escrito por Shivam.Pradhan 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 *