Given a positive integer N, find the maximum number of segments of lengths a, b and c that can be formed from N . 
Examples : 
 
Input : N = 7, a = 5, b, = 2, c = 5 Output : 2 N can be divided into 2 segments of lengths 2 and 5. For the second example, Input : N = 17, a = 2, b = 1, c = 3 Output : 17 N can be divided into 17 segments of 1 or 8 segments of 2 and 1 segment of 1. But 17 segments of 1 is greater than 9 segments of 2 and 1.
To understand any DP problem clearly, we need to write first of all its recursive code and then go for optimization.
Recursion-Based Solution:
Here for any value of n, we have 3 possibilities, for making the maximum segment count if (n >= a) we can make 1 segment of length a + another possible segment from the length of n - a if (n >= b) we can make 1 segment of length b + another possible segment from the length of n - b if (n >= c) we can make 1 segment of length c + another possible segment from the length of n - c so now we have to take the maximum possible segment above in 3 condition
Below is an implementation for the same.
C++
// C++ implementation to divide N into maximum// number of segments of length a, b and c#include <bits/stdc++.h>using namespace std;// Function to find the maximum number// of segmentsint maximumSegments(int n, int a, int b, int c){    // Base case    if (n == 0) {        return 0;    }    int maxa = INT_MIN;    // Conditions    // Making one segment of length a    if (n >= a) {        maxa = max(maxa,                   1 + maximumSegments(n - a, a, b, c));    }    // Making one segment of length b    if (n >= b) {        maxa = max(maxa,                   1 + maximumSegments(n - b, a, b, c));    }    // Making one segment of length c    if (n >= c) {        maxa = max(maxa,                   1 + maximumSegments(n - c, a, b, c));    }    // Return maximum out of all possible segment    return maxa;}// Driver codeint main(){    int n = 7, a = 5, b = 2, c = 5;    // Function call    cout << maximumSegments(n, a, b, c);    return 0;} | 
Java
// Java implementation to divide N into // maximum number of segments of length a, b and cclass GFG {  static int INT_MIN = -1000000000;  // Function to find the maximum number of segments  static int maximumSegments(int n, int a, int b, int c)   {    // Base case    if (n == 0) {      return 0;    }    int maxa = INT_MIN;    // Conditions    // Making one segment of length a    if (n >= a) {      maxa = Math.max(maxa, 1 + maximumSegments(n - a, a, b, c));    }    // Making one segment of length b    if (n >= b) {      maxa = Math.max(maxa, 1 + maximumSegments(n - b, a, b, c));    }    // Making one segment of length c    if (n >= c) {      maxa = Math.max(maxa, 1 + maximumSegments(n - c, a, b, c));    }    // Return maximum out of all possible segment    return maxa;  }  // Driver code  public static void main(String[] args) {    int n = 7, a = 5, b = 2, c = 5;    // Function call    System.out.println(maximumSegments(n, a, b, c));  }}// This code is contributed by ajaymakvana. | 
Python
# Python implementation to divide N into maximum# number of segments of length a, b and c# Function to find the maximum number# of segmentsdef maximumSegments(n, a, b, c):    # Base case    if n == 0:        return 0    maxa = float('-inf')    # Conditions    # Making one segment of length a    if n >= a:        maxa = max(maxa,                   1 + maximumSegments(n - a, a, b, c))    # Making one segment of length b    if n >= b:        maxa = max(maxa,                   1 + maximumSegments(n - b, a, b, c))    # Making one segment of length c    if n >= c:        maxa = max(maxa,                   1 + maximumSegments(n - c, a, b, c))    # Return maximum out of all possible segment    return maxa# Driver codeif __name__ == '__main__':    n = 7    a = 5    b = 2    c = 5    # Function call    print(maximumSegments(n, a, b, c)) # This code is contributed by divyansh2212 | 
C#
using System;namespace ConsoleApp {  class Program {    static void Main(string[] args)    {      int n = 7, a = 5, b = 2, c = 5;      Console.WriteLine(maximumSegments(n, a, b, c));    }    // Function to find the maximum number of segments    static int maximumSegments(int n, int a, int b, int c)    {      // Base case      if (n == 0) {        return 0;      }      int maxa = int.MinValue;      // Conditions      // Making one segment of length a      if (n >= a) {        maxa = Math.Max(          maxa, 1 + maximumSegments(n - a, a, b, c));      }      // Making one segment of length b      if (n >= b) {        maxa = Math.Max(          maxa, 1 + maximumSegments(n - b, a, b, c));      }      // Making one segment of length c      if (n >= c) {        maxa = Math.Max(          maxa, 1 + maximumSegments(n - c, a, b, c));      }      // Return maximum out of all possible segments      return maxa;    }  }}// This code is contributed by divyansh2212 | 
Javascript
// Javascript implementation to divide N into maximum// number of segments of length a, b and c// Function to find the maximum number// of segmentsfunction maximumSegments(n, a, b, c) {    // Base case    if (n === 0) {        return 0;    }    let maxa = Number.MIN_SAFE_INTEGER;    // Making one segment of length a    if (n >= a) {        maxa = Math.max(maxa,                   1 + maximumSegments(n - a, a, b, c));    }    // Making one segment of length b    if (n >= b) {        maxa = Math.max(maxa,                   1 + maximumSegments(n - b, a, b, c));    }    // Making one segment of length c    if (n >= c) {        maxa = Math.max(maxa,                   1 + maximumSegments(n - c, a, b, c));    }    // Return maximum out of all possible segment    return maxa;}// Driver codelet n = 7, a = 5, b = 2, c = 5;// Function callconsole.log(maximumSegments(n, a, b, c));// This code is contributed by poojaagarwal2. | 
2
Time Complexity: O(3n)
Auxiliary Space : O(n)
Optimized Approach : The approach used is Dynamic Programming. The base dp0 will be 0 as initially it has no segments. After that, iterate from 1 to n, and for each of the 3 states i.e, dpi+a, dpi+b and dpi+c, store the maximum value obtained by either using or not using the a, b or c segment. 
The 3 states to deal with are : 
 
dpi+a=max(dpi+1, dpi+a);
dpi+b=max(dpi+1, dpi+b);
dpi+c=max(dpi+1, dpi+c);
Below is the implementation of above idea : 
 
C++
// C++ implementation to divide N into// maximum number of segments// of length a, b and c#include <bits/stdc++.h>using namespace std;// function to find the maximum// number of segmentsint maximumSegments(int n, int a, int b, int c){    // stores the maximum number of    // segments each index can have    int dp[n + 1];    // initialize with -1    memset(dp, -1, sizeof(dp));    // 0th index will have 0 segments    // base case    dp[0] = 0;    // traverse for all possible    // segments till n    for (int i = 0; i < n; i++) {        if (dp[i] != -1) {            // conditions            if (i + a <= n) // avoid buffer overflow                dp[i + a] = max(dp[i] + 1, dp[i + a]);            if (i + b <= n) // avoid buffer overflow                dp[i + b] = max(dp[i] + 1, dp[i + b]);            if (i + c <= n) // avoid buffer overflow                dp[i + c] = max(dp[i] + 1, dp[i + c]);        }    }    return dp[n];}// Driver codeint main(){    int n = 7, a = 5, b = 2, c = 5;    cout << maximumSegments(n, a, b, c);    return 0;} | 
Java
// Java implementation to divide N into// maximum number of segments// of length a, b and cimport java.util.*;class GFG {         // function to find the maximum    // number of segments    static int maximumSegments(int n, int a,                             int b, int c)    {        // stores the maximum number of        // segments each index can have        int dp[] = new int[n + 10];        // initialize with -1        Arrays.fill(dp, -1);        // 0th index will have 0 segments        // base case        dp[0] = 0;         // traverse for all possible         // segments till n        for (int i = 0; i < n; i++)         {            if (dp[i] != -1)             {                // conditions                if(i + a <= n )    //avoid buffer overflow                dp[i + a] = Math.max(dp[i] + 1,                                     dp[i + a]);                                                     if(i + b <= n )    //avoid buffer overflow                dp[i + b] = Math.max(dp[i] + 1,                                         dp[i + b]);                                                     if(i + c <= n )    //avoid buffer overflow                dp[i + c] = Math.max(dp[i] + 1,                                     dp[i + c]);            }        }        return dp[n];    }    // Driver code    public static void main(String arg[])    {        int n = 7, a = 5, b = 2, c = 5;        System.out.print(maximumSegments(n, a, b, c));    }}// This code is contributed by Anant Agarwal. | 
Python3
# Python implementation # to divide N into maximum # number of segments of # length a, b and c# function to find # the maximum number # of segmentsdef maximumSegments(n, a, b, c) :    # stores the maximum     # number of segments     # each index can have    dp = [-1] * (n + 10)    # 0th index will have     # 0 segments base case    dp[0] = 0    # traverse for all possible    # segments till n    for i in range(0, n) :             if (dp[i] != -1) :                     # conditions            if(i + a <= n ): # avoid buffer overflow                    dp[i + a] = max(dp[i] + 1,                             dp[i + a])                                         if(i + b <= n ): # avoid buffer overflow                    dp[i + b] = max(dp[i] + 1,                             dp[i + b])                                         if(i + c <= n ): # avoid buffer overflow                    dp[i + c] = max(dp[i] + 1,                             dp[i + c])    return dp[n]# Driver coden = 7a = 5b = 2c = 5print (maximumSegments(n, a,                     b, c))# This code is contributed by # Manish Shaw(manishshaw1) | 
C#
// C# implementation to divide N into// maximum number of segments// of length a, b and cusing System;class GFG {         // function to find the maximum    // number of segments    static int maximumSegments(int n, int a,                             int b, int c)    {        // stores the maximum number of        // segments each index can have        int []dp = new int[n + 10];        // initialize with -1        for(int i = 0; i < n + 10; i++)        dp[i]= -1;                 // 0th index will have 0 segments        // base case        dp[0] = 0;         // traverse for all possible        // segments till n        for (int i = 0; i < n; i++)         {            if (dp[i] != -1)             {                // conditions                if(i + a <= n )    // avoid buffer overflow                dp[i + a] = Math.Max(dp[i] + 1,                                     dp[i + a]);                                                     if(i + b <= n )    // avoid buffer overflow                dp[i + b] = Math.Max(dp[i] + 1,                                     dp[i + b]);                                                     if(i + c <= n )    // avoid buffer overflow                dp[i + c] = Math.Max(dp[i] + 1,                                     dp[i + c]);            }        }        return dp[n];    }    // Driver code    public static void Main()    {        int n = 7, a = 5, b = 2, c = 5;        Console.Write(maximumSegments(n, a, b, c));    }}// This code is contributed by nitin mittal | 
PHP
<?php// PHP implementation to divide // N into maximum number of // segments of length a, b and c// function to find the maximum// number of segmentsfunction maximumSegments($n, $a,                         $b, $c){    // stores the maximum     // number of segments     // each index can have    $dp = array();    // initialize with -1    for($i = 0; $i < $n + 10; $i++)        $dp[$i]= -1;         // 0th index will have     // 0 segments base case    $dp[0] = 0;     // traverse for all possible    // segments till n    for ($i = 0; $i < $n; $i++)     {        if ($dp[$i] != -1)         {            // conditions            if($i + $a <= $n )    // avoid buffer overflow            $dp[$i + $a] = max($dp[$i] + 1,                             $dp[$i + $a]);                                         if($i + $b <= $n )    // avoid buffer overflow            $dp[$i + $b] = max($dp[$i] + 1,                             $dp[$i + $b]);                                         if($i + $c <= $n )    // avoid buffer overflow            $dp[$i + $c] = max($dp[$i] + 1,                             $dp[$i + $c]);        }    }    return $dp[$n];}// Driver code$n = 7; $a = 5; $b = 2; $c = 5;echo (maximumSegments($n, $a,                     $b, $c));// This code is contributed by // Manish Shaw(manishshaw1)?> | 
Javascript
<script>// JavaScript program implementation to divide N into// maximum number of segments// of length a, b and c    // function to find the maximum    // number of segments    function maximumSegments(n, a, b, c)    {        // stores the maximum number of        // segments each index can have        let dp = [];           // initialize with -1        for(let i = 0; i < n + 10; i++)        dp[i]= -1;           // 0th index will have 0 segments        // base case        dp[0] = 0;            // traverse for all possible         // segments till n        for (let i = 0; i < n; i++)         {            if (dp[i] != -1)             {                   // conditions                if(i + a <= n )    //avoid buffer overflow                dp[i + a] = Math.max(dp[i] + 1,                                     dp[i + a]);                                                       if(i + b <= n )    //avoid buffer overflow                dp[i + b] = Math.max(dp[i] + 1,                                         dp[i + b]);                                                       if(i + c <= n )    //avoid buffer overflow                dp[i + c] = Math.max(dp[i] + 1,                                     dp[i + c]);            }        }        return dp[n];    }   // Driver Code        let n = 7, a = 5, b = 2, c = 5;        document.write(maximumSegments(n, a, b, c));// This code is contributed by susmitakundugoaldanga.</script> | 
2
Time Complexity: O(N), as we are using a loop to traverse N times.
Auxiliary Space: O(N), as we are using extra space for dp array.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!
