Skip to content
Related Articles

Related Articles

Maximum value with the choice of either dividing or considering as it is
  • Difficulty Level : Basic
  • Last Updated : 22 Apr, 2021

We are given a number n, we need to find the maximum sum possible with the help of following function: 
F(n) = max( (F(n/2) + F(n/3) + F(n/4) + F(n/5)), n). To calculate F(n, ) we may either have n as our result or we can further break n into four part as in given function definition. This can be done as much time as we can. Find the maximum possible sum you can get from a given N. Note : 1 can not be break further so F(1) = 1 as a base case.

Examples : 

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

Approach : This problem can be solve with recursive approach but that will cost us a high complexity because of its overlapping sub problems. So we apply dynamic programming concept to solve this question in bottom up manner as:

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>
Output
MaxSum =106

Time Complexity: O(N)
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important mathematical concepts for competitive programming with the Essential Maths for CP Course at a student-friendly price. To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.




My Personal Notes arrow_drop_up
Recommended Articles
Page :