# Break Number Into 3 parts to find max sum

Dynamic ProgrammingAlgorithmsData Structure

A number is given. Our task is to break the number three times by n/2, n/3, and n/4 and find maximum sum we can make by dividing the number into three parts.

For an example, 50 can be divided into {25, 16, 12}, now break each of the set {25, 16, 12}, into three divisions again, and so on. After completing the division up to 3 times, we will calculate the sum to find the maximum of them.

This program can be solved in a recursive way, but in the recursive approach, we need to find the same results for multiple times, so if we use the Dynamic programming approach and store the previously calculated data in a table, then it will reduce the time.

## Input and Output

Input:
Let the given number is 12.
Output:
At first divide the 12 as (12/2 + 12/3 + 12/4) = 6 + 4 + 3 = 13.
now divide 6 into three parts (6/2 + 6/3 + 6/4) = 3 + 2 + 1 = 6.
If we divide the 4 and 3, we can get maximum 4 from them. From all values the maximum is 13.

## Algorithm

maxBreakSum(n)

Input: The given number.

Output: Maximum sum after breaking.

Begin
define sums array of size n+1
sums[0] := 0, sums[1] := 1

for i in range 2 to n, do
sum[i] := maximum of i and (sums[i/2] + sums[i/3] + sums[i/d])
done
return sums[n]
End

## Example

#include<iostream>
#define MAX 1000000
using namespace std;

int max(int a, int b) {
return (a>b)?a:b;
}

int maxBreakSum(int n) {
int sumArr[n+1];
sumArr[0] = 0, sumArr[1] = 1;    //for number 0 and 1, the maximum sum is 0 and 1 respectively

for (int i=2; i<=n; i++)    //for number 2 to n find the sum list
sumArr[i] = max(sumArr[i/2] + sumArr[i/3] + sumArr[i/4], i);    //divide number by 2, 3, 4
return sumArr[n];
}

int main() {
int n;
cout << "Enter a number: "; cin >> n;
cout << "Maximum sum after breaking: " << maxBreakSum(n);
}

## Output

Enter a number: 12
Maximum sum after breaking: 13
Published on 11-Jul-2018 11:06:46