Given an array and a number, print all subsets with sum equal to given the sum.
Examples:
Input : arr[] = {2, 5, 8, 4, 6, 11}, sum = 13
Output :
5 8
2 11
2 5 6
Input : arr[] = {1, 5, 8, 4, 6, 11}, sum = 9
Output :
5 4
1 8
This problem is an extension of check if there is a subset with given sum. We recursively generate all subsets. We keep track of elements of current subset. If sum of elements in current subset becomes equal to given sum, we print the subset.
C++
#include <bits/stdc++.h>
using namespace std;
void printAllSubsetsRec( int arr[], int n, vector< int > v,
int sum)
{
if (sum == 0) {
for ( auto x : v)
cout << x << " " ;
cout << endl;
return ;
}
if (n == 0)
return ;
printAllSubsetsRec(arr, n - 1, v, sum);
v.push_back(arr[n - 1]);
printAllSubsetsRec(arr, n - 1, v, sum - arr[n - 1]);
}
void printAllSubsets( int arr[], int n, int sum)
{
vector< int > v;
printAllSubsetsRec(arr, n, v, sum);
}
int main()
{
int arr[] = { 2, 5, 8, 4, 6, 11 };
int sum = 13;
int n = sizeof (arr) / sizeof (arr[0]);
printAllSubsets(arr, n, sum);
return 0;
}
|
Java
import java.util.*;
class Solution
{
static void printAllSubsetsRec( int arr[], int n, Vector<Integer> v,
int sum)
{
if (sum == 0 ) {
for ( int i= 0 ;i<v.size();i++)
System.out.print( v.get(i) + " " );
System.out.println();
return ;
}
if (n == 0 )
return ;
printAllSubsetsRec(arr, n - 1 , v, sum);
Vector<Integer> v1= new Vector<Integer>(v);
v1.add(arr[n - 1 ]);
printAllSubsetsRec(arr, n - 1 , v1, sum - arr[n - 1 ]);
}
static void printAllSubsets( int arr[], int n, int sum)
{
Vector<Integer> v= new Vector<Integer>();
printAllSubsetsRec(arr, n, v, sum);
}
public static void main(String args[])
{
int arr[] = { 2 , 5 , 8 , 4 , 6 , 11 };
int sum = 13 ;
int n = arr.length;
printAllSubsets(arr, n, sum);
}
}
|
Python3
def printAllSubsetsRec(arr, n, v, sum ) :
if ( sum = = 0 ) :
for value in v :
print (value, end = " " )
print ()
return
if (n = = 0 ):
return
printAllSubsetsRec(arr, n - 1 , v, sum )
v1 = [] + v
v1.append(arr[n - 1 ])
printAllSubsetsRec(arr, n - 1 , v1, sum - arr[n - 1 ])
def printAllSubsets(arr, n, sum ):
v = []
printAllSubsetsRec(arr, n, v, sum )
arr = [ 2 , 5 , 8 , 4 , 6 , 11 ]
sum = 13
n = len (arr)
printAllSubsets(arr, n, sum )
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static void printAllSubsetsRec( int []arr, int n,
List< int > v, int sum)
{
if (sum == 0)
{
for ( int i = 0; i < v.Count; i++)
Console.Write( v[i]+ " " );
Console.WriteLine();
return ;
}
if (n == 0)
return ;
printAllSubsetsRec(arr, n - 1, v, sum);
List< int > v1 = new List< int >(v);
v1.Add(arr[n - 1]);
printAllSubsetsRec(arr, n - 1, v1, sum - arr[n - 1]);
}
static void printAllSubsets( int []arr, int n, int sum)
{
List< int > v = new List< int >();
printAllSubsetsRec(arr, n, v, sum);
}
public static void Main()
{
int []arr = { 2, 5, 8, 4, 6, 11 };
int sum = 13;
int n = arr.Length;
printAllSubsets(arr, n, sum);
}
}
|
PHP
<?php
function printAllSubsetsRec( $arr , $n , $v , $sum )
{
if ( $sum == 0)
{
for ( $i = 0; $i < count ( $v ); $i ++)
echo $v [ $i ] . " " ;
echo "\n" ;
return ;
}
if ( $n == 0)
return ;
printAllSubsetsRec( $arr , $n - 1, $v , $sum );
array_push ( $v , $arr [ $n - 1]);
printAllSubsetsRec( $arr , $n - 1, $v ,
$sum - $arr [ $n - 1]);
}
function printAllSubsets( $arr , $n , $sum )
{
$v = array ();
printAllSubsetsRec( $arr , $n , $v , $sum );
}
$arr = array ( 2, 5, 8, 4, 6, 11 );
$sum = 13;
$n = count ( $arr );
printAllSubsets( $arr , $n , $sum );
?>
|
Javascript
<script>
function printAllSubsetsRec(arr, n, v, sum) {
if (sum == 0) {
for (let x of v)
document.write(x + " " );
document.write( "<br>" )
return ;
}
if (n == 0)
return ;
printAllSubsetsRec(arr, n - 1, v, sum);
v.push(arr[n - 1]);
printAllSubsetsRec(arr, n - 1, v, sum - arr[n - 1]);
v.pop();
}
function printAllSubsets(arr, n, sum) {
let v = [];
printAllSubsetsRec(arr, n, v, sum);
}
let arr = [2, 5, 8, 4, 6, 11];
let sum = 13;
let n = arr.length;
printAllSubsets(arr, n, sum);
</script>
|
Time Complexity : O(2n)
Please refer below post for an optimized solution based on Dynamic Programming.
Print all subsets with given sum using Dynamic Programming