Check if an array can be split into 3 subsequences of equal sum or not

Given an array arr[] having N integers. The task is to determine if the array can be partitioned into 3 subsequences of an equal sum or not. If yes then print “Yes”. Otherwise, print “No”.
Examples:
Input: arr[] = {1, 1, 1}
Output: Yes
Explanation:
Here array can be partition into 3 equal sum. {1}Input: arr[] = {40}
Output: No
Explanation:
Here array cannot be partition into 3 equal sum.
Recursive Approach: This problem can be solved using recursion. Below are the steps:
- Initialize three variable sum1, sum2, and sum3 to value 0.
- Then every element of array arr[] is added to either of these 3 variables, which give all the possible combinations.
- In case, any subsequences having 3 equal sums then the array can be partition.
- If the array can be partition then print “Yes” else print “No”.
C++
| // C++ program for // the above approach#include <bits/stdc++.h>usingnamespacestd;// Utility function to check array can// be partition to 3 subsequences of// equal sum or notintcheckEqualSumUtil(intarr[], intN,                      intsm1, intsm2,                      intsm3, intj){      // Base Case  if(j == N)   {    if(sm1 == sm2 && sm2 == sm3)      return1;    else      return0;  }  else  {    // When element at index    // j is added to sm1    intl = checkEqualSumUtil(arr, N,                              sm1 + arr[j],                               sm2, sm3, j + 1);    // When element at index    // j is added to sm2    intm = checkEqualSumUtil(arr, N, sm1,                              sm2 + arr[j],                              sm3, j + 1);    // When element at index    // j is added to sm3    intr = checkEqualSumUtil(arr, N, sm1, sm2,                              sm3 + arr[j], j + 1);    // Return maximum value among    // all above 3 recursive call    returnmax(max(l, m), r);  }}// Function to check array can be// partition to 3 subsequences of// equal sum or notvoidcheckEqualSum(intarr[], intN){  // Initialise 3 sums to 0  intsum1, sum2, sum3;  sum1 = sum2 = sum3 = 0;  // Function Call  if(checkEqualSumUtil(arr, N, sum1,                        sum2, sum3, 0)== 1)   {    cout << "Yes";  }  else  {    cout << "No";  }}// Driver Codeintmain(){  // Given array arr[]  intarr[] = {17, 34, 59, 23, 17, 67,               57, 2, 18, 59, 1 };  intN = sizeof(arr) / sizeof(arr[0]);  // Function Call  checkEqualSum(arr, N);  return0;} | 
Java
| // Java program for // the above approachclassGFG{// Utility function to check array can// be partition to 3 subsequences of// equal sum or notstaticintcheckEqualSumUtil(intarr[], intN,                             intsm1, intsm2,                             intsm3, intj){  // Base Case  if(j == N)  {    if(sm1 == sm2 && sm2 == sm3)      return1;    else      return0;  }  else  {    // When element at index    // j is added to sm1    intl = checkEqualSumUtil(arr, N,                               sm1 + arr[j],                               sm2, sm3, j + 1);    // When element at index    // j is added to sm2    intm = checkEqualSumUtil(arr, N, sm1,                               sm2 + arr[j],                               sm3, j + 1);    // When element at index    // j is added to sm3    intr = checkEqualSumUtil(arr, N, sm1, sm2,                              sm3 + arr[j], j + 1);    // Return maximum value among    // all above 3 recursive call    returnMath.max(Math.max(l, m), r);  }}// Function to check array can be// partition to 3 subsequences of// equal sum or notstaticvoidcheckEqualSum(intarr[], intN){  // Initialise 3 sums to 0  intsum1, sum2, sum3;  sum1 = sum2 = sum3 = 0;  // Function Call  if(checkEqualSumUtil(arr, N, sum1,                        sum2, sum3, 0) == 1)   {    System.out.print("Yes");  }  else  {    System.out.print("No");  }}// Driver Codepublicstaticvoidmain(String[] args){  // Given array arr[]  intarr[] = {17, 34, 59, 23, 17,               67, 57, 2, 18, 59, 1};          intN = arr.length;  // Function Call  checkEqualSum(arr, N);}}// This code is contributed by Rajput-Ji | 
Python3
| # Python3 program for the above approach # Utility function to check array can # be partition to 3 subsequences of # equal sum or not defcheckEqualSumUtil(arr, N, sm1, sm2, sm3, j):        # Base case    ifj ==N:        ifsm1 ==sm2 andsm2 ==sm3:            return1        else:            return0    else:                # When element at index         # j is added to sm1         l =checkEqualSumUtil(arr, N, sm1 +arr[j],                              sm2, sm3, j +1)                # When element at index         # j is added to sm2         m =checkEqualSumUtil(arr, N, sm1,                               sm2 +arr[j],                               sm3, j +1)                # When element at index         # j is added to sm3         r =checkEqualSumUtil(arr, N, sm1,                              sm2, sm3 +arr[j],                                     j +1)                # Return maximum value among         # all above 3 recursive call         returnmax(l, m, r)    # Function to check array can be # partition to 3 subsequences of # equal sum or not defcheckEqualSum(arr, N):        # Initialise 3 sums to 0    sum1 =sum2 =sum3 =0        # Function call    ifcheckEqualSumUtil(arr, N, sum1,                          sum2, sum3, 0) ==1:        print("Yes")    else:        print("No")    # Driver code    # Given array arr[] arr =[ 17, 34, 59, 23, 17,        67, 57, 2, 18, 59, 1]N =len(arr)# Function callcheckEqualSum(arr, N)# This code is contributed by Stuti Pathak | 
C#
| // C# program for // the above approachusingSystem;classGFG{// Utility function to check array can// be partition to 3 subsequences of// equal sum or notstaticintcheckEqualSumUtil(int[] arr, intN,                              intsm1, intsm2,                              intsm3, intj){  // Base Case  if(j == N)   {    if(sm1 == sm2 && sm2 == sm3)      return1;    else      return0;  }  else  {    // When element at index    // j is added to sm1    intl = checkEqualSumUtil(arr, N,                               sm1 + arr[j],                              sm2, sm3, j + 1);    // When element at index    // j is added to sm2    intm = checkEqualSumUtil(arr, N, sm1,                               sm2 + arr[j],                               sm3, j + 1);    // When element at index    // j is added to sm3    intr = checkEqualSumUtil(arr, N,                               sm1, sm2,                              sm3 + arr[j],                               j + 1);    // Return maximum value among    // all above 3 recursive call    returnMath.Max(Math.Max(l, m), r);  }}// Function to check array can be// partition to 3 subsequences of// equal sum or notstaticvoidcheckEqualSum(int[] arr, intN){  // Initialise 3 sums to 0  intsum1, sum2, sum3;  sum1 = sum2 = sum3 = 0;  // Function Call  if(checkEqualSumUtil(arr, N, sum1,                         sum2, sum3, 0) == 1)   {    Console.Write("Yes");  }  else  {    Console.Write("No");  }}// Driver CodepublicstaticvoidMain(){  // Given array arr[]  int[] arr = {17, 34, 59, 23, 17,                67, 57, 2, 18, 59, 1};  intN = arr.Length;  // Function Call  checkEqualSum(arr, N);}}// This code is contributed by Chitranayal | 
Javascript
| <script>// Java script program for// the above approach// Utility function to check array can// be partition to 3 subsequences of// equal sum or notfunctioncheckEqualSumUtil( arr,  N,                             sm1,  sm2,                             sm3,  j){// Base Caseif(j == N){    if(sm1 == sm2 && sm2 == sm3)    return1;    else    return0;}else{    // When element at index    // j is added to sm1    let l = checkEqualSumUtil(arr, N,                            sm1 + arr[j],                            sm2, sm3, j + 1);    // When element at index    // j is added to sm2    let m = checkEqualSumUtil(arr, N, sm1,                            sm2 + arr[j],                            sm3, j + 1);    // When element at index    // j is added to sm3    let r = checkEqualSumUtil(arr, N, sm1, sm2,                            sm3 + arr[j], j + 1);    // Return maximum value among    // all above 3 recursive call    returnMath.max(Math.max(l, m), r);}}// Function to check array can be// partition to 3 subsequences of// equal sum or notfunctioncheckEqualSum(arr,N){// Initialise 3 sums to 0let sum1, sum2, sum3;sum1 = sum2 = sum3 = 0;// Function Callif(checkEqualSumUtil(arr, N, sum1,                        sum2, sum3, 0) == 1){    document.write("Yes");}else{    document.write("No");}}// Driver Code// Given array arr[]let arr = [17, 34, 59, 23, 17,            67, 57, 2, 18, 59, 1];    let N = arr.length;// Function CallcheckEqualSum(arr, N);// This code is contributed by sravan kumar </script> | 
Yes
Time Complexity: O(3N)
Auxiliary Space: O(1)
Dynamic Programming Approach: This problem can be solved using dynamic programming, the idea is to store all the overlapping subproblems value in a map and use the value of overlapping substructure to reduce the number of the recursive calls. Below are the steps:
- Let sum1, sum2, and sum3 be the three equal sum to be partitioned.
- Create a map dp having the key.
- Traverse the given array and do the following:
- Base Case: While traversing the array if we reach the end of the array then check if the value of sum1, sum2, and sum3 are equal then return 1 that will ensure that we can break the given array into a subsequence of equal sum value. Otherwise, return 0.
- Recursive Call: For each element in the array include each element in sum1, sum2, and sum3 one by one and return the maximum of these recursive calls.
 
a = recursive_function(arr, N, sum1 + arr[j], sum2, sum3, j + 1)
b = recursive_function(arr, N, sum1, sum2 + arr[j], sum3, j + 1)
c = recursive_function(arr, N, sum1, sum2, sum3 + arr[j], j + 1)
- Return Statement: In the above recursive call the maximum of the three values will give the result for the current recursive call. Update the current state in the dp table as:
string s = to_string(sum1) + ‘_’ + to_string(sum2) + to_string(j)
return dp[s] = max(a, max(b, c) )
- If there can be partition possible then print “Yes” else print “No”.
Below is the implementation of the above approach:
C++
| // C++ program for the above approach#include <bits/stdc++.h>usingnamespacestd;map<string, int> dp;// Function to check array can be// partition into sum of 3 equalintcheckEqualSumUtil(intarr[], intN,                      intsm1,                      intsm2,                      intsm3, intj){    string s = to_string(sm1)               + "_"+ to_string(sm2)               + to_string(j);    // Base Case    if(j == N) {        if(sm1 == sm2 && sm2 == sm3)            return1;        else            return0;    }    // If value at particular index is not    // -1 then return value at that index    // which ensure no more further calls    if(dp.find(s) != dp.end())        returndp[s];    else{        // When element at index        // j is added to sm1        intl = checkEqualSumUtil(            arr, N, sm1 + arr[j],            sm2, sm3, j + 1);        // When element at index        // j is added to sm2        intm = checkEqualSumUtil(            arr, N, sm1, sm2 + arr[j],            sm3, j + 1);        // When element at index        // j is added to sm3        intr = checkEqualSumUtil(            arr, N, sm1, sm2,            sm3 + arr[j], j + 1);        // Update the current state and        // return that value        returndp[s] = max(max(l, m), r);    }}// Function to check array can be// partition to 3 subsequences of// equal sum or notvoidcheckEqualSum(intarr[], intN){    // Initialise 3 sums to 0    intsum1, sum2, sum3;    sum1 = sum2 = sum3 = 0;    // Function Call    if(checkEqualSumUtil(            arr, N, sum1,            sum2, sum3, 0)        == 1) {        cout << "Yes";    }    else{        cout << "No";    }}// Driver Codeintmain(){    // Given array arr[]    intarr[]        = { 17, 34, 59, 23, 17, 67,            57, 2, 18, 59, 1 };    intN = sizeof(arr) / sizeof(arr[0]);    // Function Call    checkEqualSum(arr, N);    return0;} | 
Java
| // Java program for // the above approachimportjava.util.*;classGFG{staticHashMap<String,               Integer> dp = newHashMap<String,                                         Integer>();// Function to check array can be// partition into sum of 3 equalstaticintcheckEqualSumUtil(intarr[], intN,                             intsm1, intsm2,                             intsm3, intj){  String s = String.valueOf(sm1) + "_"+   String.valueOf(sm2) + String.valueOf(j);  // Base Case  if(j == N)   {    if(sm1 == sm2 && sm2 == sm3)      return1;    else      return0;  }  // If value at particular index is not  // -1 then return value at that index  // which ensure no more further calls  if(dp.containsKey(s))    returndp.get(s);  else  {    // When element at index    // j is added to sm1    intl = checkEqualSumUtil(arr, N, sm1 + arr[j],                              sm2, sm3, j + 1);    // When element at index    // j is added to sm2    intm = checkEqualSumUtil(arr, N, sm1,                               sm2 + arr[j],                               sm3, j + 1);    // When element at index    // j is added to sm3    intr = checkEqualSumUtil(arr, N, sm1, sm2,                              sm3 + arr[j], j + 1);    // Update the current state and    // return that value    dp.put(s, Math.max(Math.max(l, m), r));    returndp.get(s);  }}// Function to check array can be// partition to 3 subsequences of// equal sum or notstaticvoidcheckEqualSum(intarr[], intN){  // Initialise 3 sums to 0  intsum1, sum2, sum3;  sum1 = sum2 = sum3 = 0;  // Function Call  if(checkEqualSumUtil(arr, N, sum1,                        sum2, sum3, 0) == 1)   {    System.out.print("Yes");  }  else  {    System.out.print("No");  }}// Driver Codepublicstaticvoidmain(String[] args){  // Given array arr[]  intarr[] = {17, 34, 59, 23, 17,                67, 57, 2, 18, 59, 1};  intN = arr.length;  // Function Call  checkEqualSum(arr, N);}}// This code is contributed by 29AjayKumar | 
Python3
| # Python3 program for the above approach dp ={}# Function to check array can be # partition into sum of 3 equal defcheckEqualSumUtil(arr, N, sm1, sm2, sm3, j):        s =str(sm1) +"_"+str(sm2) +str(j)        # Base Case    ifj ==N:        ifsm1 ==sm2 andsm2 ==sm3:            return1        else:            return0            # If value at particular index is not     # -1 then return value at that index     # which ensure no more further calls     ifs indp:        returndp[s]        # When element at index     # j is added to sm1     l =checkEqualSumUtil(arr, N, sm1 +arr[j],                          sm2, sm3, j +1)        # When element at index     # j is added to sm2     m =checkEqualSumUtil(arr, N, sm1,                          sm2 +arr[j], sm3,                            j +1)        # When element at index     # j is added to sm3     r =checkEqualSumUtil(arr, N, sm1,                           sm2, sm3 +arr[j],                                  j +1)        # Update the current state and     # return that value     dp[s] =max(l, m, r)        returndp[s]# Function to check array can be # partition to 3 subsequences of # equal sum or not defcheckEqualSum(arr, N):        # Initialise 3 sums to 0     sum1 =sum2 =sum3 =0        # Function Call    ifcheckEqualSumUtil(arr, N, sum1,                         sum2, sum3, 0) ==1:        print("Yes")    else:        print("No")        # Driver code# Given array arr[] arr =[ 17, 34, 59, 23, 17,         67, 57, 2, 18, 59, 1]N =len(arr)# Function call checkEqualSum(arr, N)# This code is contributed by Stuti Pathak | 
C#
| // C# program for the above approachusingSystem;usingSystem.Collections.Generic;classGFG{    staticDictionary<string,                   int> dp = newDictionary<string,                                           int>(); // Function to check array can be// partition into sum of 3 equalstaticintcheckEqualSumUtil(int[]arr, intN,                             intsm1, intsm2,                             intsm3, intj){    strings = sm1.ToString() + "_"+                sm2.ToString() + j.ToString();        // Base Case    if(j == N)     {        if(sm1 == sm2 && sm2 == sm3)            return1;        else            return0;    }        // If value at particular index is not    // -1 then return value at that index    // which ensure no more further calls    if(dp.ContainsKey(s))        returndp[s];        else    {                // When element at index        // j is added to sm1        intl = checkEqualSumUtil(arr, N, sm1 + arr[j],                                  sm2, sm3, j + 1);                // When element at index        // j is added to sm2        intm = checkEqualSumUtil(arr, N, sm1,                                   sm2 + arr[j],                                   sm3, j + 1);                // When element at index        // j is added to sm3        intr = checkEqualSumUtil(arr, N, sm1, sm2,                                  sm3 + arr[j], j + 1);                // Update the current state and        // return that value        dp[s] = Math.Max(Math.Max(l, m), r);                returndp[s];    }} // Function to check array can be// partition to 3 subsequences of// equal sum or notstaticvoidcheckEqualSum(int[]arr, intN){        // Initialise 3 sums to 0    intsum1, sum2, sum3;        sum1 = sum2 = sum3 = 0;        // Function call    if(checkEqualSumUtil(arr, N, sum1,                          sum2, sum3, 0) == 1)     {        Console.Write("Yes");    }    else    {        Console.Write("No");    }} // Driver CodepublicstaticvoidMain(string[] args){        // Given array arr[]    int[]arr = { 17, 34, 59, 23, 17,                   67, 57, 2, 18, 59, 1 };        intN = arr.Length;        // Function call    checkEqualSum(arr, N);}}// This code is contributed by rutvik_56 | 
Javascript
| <script>// JavaScript program for the above approachvardp = newMap();// Function to check array can be// partition into sum of 3 equalfunctioncheckEqualSumUtil(arr, N, sm1, sm2, sm3, j){    vars = (sm1.toString())               + "_"+ (sm2.toString())               + (j.toString());    // Base Case    if(j == N) {        if(sm1 == sm2 && sm2 == sm3)            return1;        else            return0;    }    // If value at particular index is not    // -1 then return value at that index    // which ensure no more further calls    if(dp.has(s))        returndp[s];    else{        // When element at index        // j is added to sm1        varl = checkEqualSumUtil(            arr, N, sm1 + arr[j],            sm2, sm3, j + 1);        // When element at index        // j is added to sm2        varm = checkEqualSumUtil(            arr, N, sm1, sm2 + arr[j],            sm3, j + 1);        // When element at index        // j is added to sm3        varr = checkEqualSumUtil(            arr, N, sm1, sm2,            sm3 + arr[j], j + 1);        // Update the current state and        // return that value        returndp[s] = Math.max(Math.max(l, m), r);    }}// Function to check array can be// partition to 3 subsequences of// equal sum or notfunctioncheckEqualSum(arr, N){    // Initialise 3 sums to 0    varsum1, sum2, sum3;    sum1 = sum2 = sum3 = 0;    // Function Call    if(checkEqualSumUtil(            arr, N, sum1,            sum2, sum3, 0)        == 1) {        document.write( "Yes");    }    else{        document.write( "No");    }}// Driver Code// Given array arr[]vararr    = [17, 34, 59, 23, 17, 67,        57, 2, 18, 59, 1];varN = arr.length;// Function CallcheckEqualSum(arr, N);</script> | 
Yes
Time Complexity: O(N*K2) 
Auxiliary Space: O(N*K2) where K is the sum of the array.
(to_string(sum1) + “_” + to_string(sum2) + “_” + to_string(sum3))
- with value is 1 if 3 equal subsets are found else value is 0.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 zambiatek!
 
				 
					


