Count of subsets with sum equal to X using Recursion
Given an array arr[] of length N and an integer X, the task is to find the number of subsets with a sum equal to X using recursion.
Examples:
Input: arr[] = {2, 3, 5, 6, 8, 10}, X = 10
Output: 3
Explanation:
All possible subsets with sum 10 are {2, 3, 5}, {2, 8}, {10}
Input: arr[] = {1, 2, 3, 4, 5}, X = 7
Output: 3
Explanation:
All possible subsets with sum 7 are {2, 5}, {3, 4}, {1, 2, 4}
Approach: The idea is to recursively check all the subsets. If any subset has the sum equal to N, then increment the count by 1. Else, continue.
In order to form a subset, there are two cases for every element:
- Include the element in the set.
- Exclude the element in the set.
Therefore, the following steps can be followed to compute the answer:
- Get the array for which the subsets with the sum equal to K is to be found.
- Recursively count the subsets with the sum equal to K in the following way:
- Base Case: The base case will be when the end of the array has been reached. If here the sum has been found as X, then increase the count of the subset by 1. Return the count evaluated in the base condition.
if (n == 0) {
if (sum == s)
count++;
return count;
}
- Recursive Call: If the base case is not satisfied, then call the function twice. Once by including the element at index ‘i’ and once by not including the element. Find the count for both these cases and then return the final count.
count = subsetSum(arr, n, sum , s , count);
count = subsetSum(arr, n, sum, s + arr[n-1], count);
- Return Statement: At every step, the count of subsets by either including a particular element or not including a particular element is returned. Finally, when the entire recursion stack is executed, the total count is returned.
From the above approach, it can be clearly analyzed that if there are N elements in the array, then a total of 2N cases arise. Every element in the array is checked for the above cases using recursion.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
int subsetSum( int arr[], int n, int i,
int sum, int count)
{
if (i == n) {
if (sum == 0) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1, sum - arr[i], count);
count = subsetSum(arr, n, i + 1, sum, count);
return count;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int sum = 10;
int n = sizeof (arr) / sizeof (arr[0]);
cout << subsetSum(arr, n, 0, sum, 0);
}
|
Java
import java.util.*;
class GFG {
static int subsetSum( int arr[], int n, int sum, int s,
int count)
{
if (n == 0 ) {
if (sum == s) {
count++;
}
return count;
}
count = subsetSum(arr, n - 1 , sum, s, count);
count = subsetSum(arr, n - 1 , sum, s + arr[n - 1 ],
count);
return count;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
int sum = 10 ;
int s = 0 ;
int n = arr.length;
System.out.print(subsetSum(arr, n, sum, s, 0 ));
}
}
|
Python3
def subsetSum(arr, n, i, sum , count):
if (i = = n):
if ( sum = = 0 ):
count + = 1
return count
count = subsetSum(arr, n, i + 1 , sum - arr[i], count)
count = subsetSum(arr, n, i + 1 , sum , count)
return count
arr = [ 1 , 2 , 3 , 4 , 5 ]
sum = 10
n = len (arr)
print (subsetSum(arr, n, 0 , sum , 0 ))
|
C#
using System;
class GFG
{
static int subsetSum( int []arr, int n, int i,
int sum, int count)
{
if (i == n)
{
if (sum == 0)
{
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1, sum - arr[i], count);
count = subsetSum(arr, n, i + 1, sum, count);
return count;
}
public static void Main(String[] args)
{
int []arr = { 1, 2, 3, 4, 5 };
int sum = 10;
int n = arr.Length;
Console.Write(subsetSum(arr, n, 0, sum, 0));
}
}
|
Javascript
<script>
function subsetSum(arr, n, i, sum, count)
{
if (i == n) {
if (sum == 0) {
count++;
}
return count;
}
count = subsetSum(arr, n, i + 1, sum - arr[i], count);
count = subsetSum(arr, n, i + 1, sum, count);
return count;
}
var arr = [1, 2, 3, 4, 5];
var sum = 10;
var n = arr.length;
document.write( subsetSum(arr, n, 0, sum, 0));
</script>
|
Time Complexity: O(2n)
Auxiliary Space: O(n)
Efficient Approach:
An efficient method to solve the problem using Dynamic Programming has been discussed in this article.
Last Updated :
07 Nov, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...