Equal sum array partition excluding a given element
Last Updated :
18 Feb, 2023
Given an array arr[] and an index in it. Find whether the array arr[] can be partitioned into two disjoint sets such that sum of both the sets is equal and none of the sets includes arr[index]
Examples :
Input : arr[] = {2, 1, 3, 4},
index = 2
Output : No
We need to exclude arr[2] which is 3.
Possible sets are :
Set 1: (2, 1), Set 2: 4, sum = 3?4
Set 1: 2, Set 2: (4, 1), sum = 2?5
Set 1: 1, Set 2: (4, 2), sum = 1?6
Neither of the sums are equal.
Input : arr[] = {2, 5, 1, 4, 0},
index = 4
Output : Yes
Set 1 : (2, 4), sum = 6
Set 2 : (5, 1), sum = 6
Approach: This problem is a variation of partition problem with an additional constraint that index cannot be included in either of the partitioned sets of array.
First find sum S of array excluding the index-th element. If the sum is even then array can be partitioned otherwise not. If the sum is even then define two variables set1Sum and set2Sum to store the sum of two sets.
It can be determined recursively that whether set1Sum is equal to set2Sum. Start from position 0 and traverse the array recursively. At every array position, there are two choices: either include current array element in set 1 or in set 2. Recursively call for both the conditions, by including current element in set 1 first then in set 2. If current position is the index to be excluded then recursively call for next position without updating any sum. When entire array is traversed then check for equality of both sets sum. If the sums are equal then result is found otherwise backtrack and check for other possibilities.
Steps to solve this problem:
1. Define a function isSubsetSumPoss that takes in an array arr, the number of elements in the array n, the sum of the first set set1Sum, the sum of the second set set2Sum, the index of the element that is to be excluded index, and the current position in the array pos.
2. If pos is equal to n, then the function returns whether set1Sum is equal to set2Sum.
3. If pos is equal to index, then the function calls itself with pos incremented by 1 without updating set1Sum or set2Sum.
4. If pos is not equal to index, then the function calls itself twice: once with set1Sum incremented by the value of arr[pos] and once with set2Sum incremented by the value of arr[pos].
5. Define a function canPartition that takes in an array arr, the number of elements in the array n, and the index of the element that is to be excluded index.
6. Calculate the sum of the entire array excluding the element at position index.
7. If the sum is not even, then return false as it is not possible to partition the array into two equal sum sets.
8. If the sum is even, call the isSubsetSumPoss function with set1Sum and set2Sum initialized to 0, index equal to the passed in index, and pos equal to 0. Return the result of the isSubsetSumPoss function.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
bool isSubsetSumPoss( int arr[], int n, int set1Sum,
int set2Sum, int index, int pos)
{
if (pos == n)
return (set1Sum == set2Sum);
if (pos == index)
isSubsetSumPoss(arr, n, set1Sum,
set2Sum, index, pos + 1);
return isSubsetSumPoss(arr, n, set1Sum + arr[pos],
set2Sum, index, pos + 1)
|| isSubsetSumPoss(arr, n, set1Sum, set2Sum +
arr[pos], index, pos + 1);
}
bool canPartition( int arr[], int n, int index)
{
int sum = 0;
for ( int i = 0; i < n; i++) {
if (i == index)
continue ;
sum += arr[i];
}
if (sum % 2 != 0)
return false ;
return isSubsetSumPoss(arr, n, 0, 0,
index, 0);
}
int main()
{
int arr[] = { 2, 5, 1, 4, 0 };
int index = 4;
int n = sizeof (arr) / sizeof (arr[0]);
if (canPartition(arr, n, index))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.io.*;
import java.util.*;
public class GFG {
static boolean isSubsetSumPoss( int []arr,
int n, int set1Sum, int set2Sum,
int index, int pos)
{
if (pos == n)
return (set1Sum == set2Sum);
if (pos == index)
isSubsetSumPoss(arr, n, set1Sum,
set2Sum, index, pos + 1 );
return isSubsetSumPoss(arr, n, set1Sum
+ arr[pos], set2Sum, index, pos + 1 )
|| isSubsetSumPoss(arr, n, set1Sum,
set2Sum + arr[pos], index, pos + 1 );
}
static boolean canPartition( int []arr, int n,
int index)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++) {
if (i == index)
continue ;
sum += arr[i];
}
if (sum % 2 != 0 )
return false ;
return isSubsetSumPoss(arr, n, 0 , 0 ,
index, 0 );
}
public static void main(String args[])
{
int []arr = { 2 , 5 , 1 , 4 , 0 };
int index = 4 ;
int n = arr.length;
if (canPartition(arr, n, index))
System.out.print( "Yes" );
else
System.out.print( "No" );
}
}
|
Python3
def isSubsetSumPoss(arr, n, set1Sum, set2Sum, index, pos) :
if (pos = = n) :
return (set1Sum = = set2Sum)
if (pos = = index) :
isSubsetSumPoss(arr, n, set1Sum, set2Sum,
index, pos + 1 )
return (isSubsetSumPoss(arr, n, set1Sum + arr[pos],
set2Sum, index, pos + 1 )
or isSubsetSumPoss(arr, n, set1Sum,
set2Sum + arr[pos], index, pos + 1 ))
def canPartition(arr, n, index) :
sum = 0
for i in range ( 0 , n) :
if (i = = index) :
continue
sum + = arr[i]
if ( sum % 2 ! = 0 ) :
return false
return isSubsetSumPoss(arr, n, 0 , 0 , index, 0 )
arr = [ 2 , 5 , 1 , 4 , 0 ]
index = 4
n = len (arr)
if (canPartition(arr, n, index)) :
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
class GFG {
static bool isSubsetSumPoss( int []arr,
int n, int set1Sum, int set2Sum,
int index, int pos)
{
if (pos == n)
return (set1Sum == set2Sum);
if (pos == index)
isSubsetSumPoss(arr, n, set1Sum,
set2Sum, index, pos + 1);
return isSubsetSumPoss(arr, n, set1Sum
+ arr[pos], set2Sum, index, pos + 1)
|| isSubsetSumPoss(arr, n, set1Sum,
set2Sum + arr[pos], index, pos + 1);
}
static bool canPartition( int []arr, int n,
int index)
{
int sum = 0;
for ( int i = 0; i < n; i++) {
if (i == index)
continue ;
sum += arr[i];
}
if (sum % 2 != 0)
return false ;
return isSubsetSumPoss(arr, n, 0, 0,
index, 0);
}
public static void Main()
{
int []arr = { 2, 5, 1, 4, 0 };
int index = 4;
int n = arr.Length;
if (canPartition(arr, n, index))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
PHP
<?php
function isSubsetSumPoss( $arr , $n , $set1Sum ,
$set2Sum , $index , $pos )
{
if ( $pos == $n )
return ( $set1Sum == $set2Sum );
if ( $pos == $index )
isSubsetSumPoss( $arr , $n , $set1Sum ,
$set2Sum , $index ,
$pos + 1);
return isSubsetSumPoss( $arr , $n , $set1Sum +
$arr [ $pos ], $set2Sum ,
$index , $pos + 1) ||
isSubsetSumPoss( $arr , $n , $set1Sum ,
$set2Sum + $arr [ $pos ],
$index , $pos + 1);
}
function canPartition( $arr , $n , $index )
{
$sum = 0;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $i == $index )
continue ;
$sum += $arr [ $i ];
}
if ( $sum % 2 != 0)
return false;
return isSubsetSumPoss( $arr , $n , 0,
0, $index , 0);
}
$arr = array ( 2, 5, 1, 4, 0 );
$index = 4;
$n = count ( $arr );
if (canPartition( $arr , $n , $index ))
echo ( "Yes" );
else
echo ( "No" );
?>
|
Javascript
<script>
function isSubsetSumPoss(arr,
n, set1Sum, set2Sum,
index, pos)
{
if (pos == n)
return (set1Sum == set2Sum);
if (pos == index)
isSubsetSumPoss(arr, n, set1Sum,
set2Sum, index, pos + 1);
return isSubsetSumPoss(arr, n, set1Sum
+ arr[pos], set2Sum, index, pos + 1)
|| isSubsetSumPoss(arr, n, set1Sum,
set2Sum + arr[pos], index, pos + 1);
}
function canPartition(arr, n, index)
{
let sum = 0;
for (let i = 0; i < n; i++) {
if (i == index)
continue ;
sum += arr[i];
}
if (sum % 2 != 0)
return false ;
return isSubsetSumPoss(arr, n, 0, 0,
index, 0);
}
let arr = [ 2, 5, 1, 4, 0 ];
let index = 4;
let n = arr.length;
if (canPartition(arr, n, index))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity : O(2^n) ,The time complexity of this algorithm is O(2^n) where n is the size of the array. This is because the recursive function is called twice for each element, leading to an exponential time complexity.
Space complexity: O(n),The space complexity of this algorithm is O(n) where n is the size of the array. This is because the recursive call stack is of size n.
Exercise : Try to solve this problem iteratively.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...