Perfect Sum Problem
Last Updated :
21 Dec, 2021
Given an array arr[] of integers and an integer K, the task is to print all subsets of the given array with the sum equal to the given target K.
Examples:
Input: arr[] = {5, 10, 12, 13, 15, 18}, K = 30
Output: {12, 18}, {5, 12, 13}, {5, 10, 15}
Explanation:
Subsets with sum 30 are:
12 + 18 = 30
5 + 12 + 13 = 30
5 + 10 + 15 = 30
Input: arr[] = {1, 2, 3, 4}, K = 5
Output: {2, 3}, {1, 4}
Approach: The idea is to find out all the subsets using the Power Set concept. For every set, check if the sum of the set is equal to K or not. If it is equal, then the set is printed.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void sumSubsets(vector< int > set, int n, int target)
{
int x[set.size()];
int j = set.size() - 1;
while (n > 0)
{
x[j] = n % 2;
n = n / 2;
j--;
}
int sum = 0;
for ( int i = 0; i < set.size(); i++)
if (x[i] == 1)
sum = sum + set[i];
if (sum == target)
{
cout<<( "{" );
for ( int i = 0; i < set.size(); i++)
if (x[i] == 1)
cout << set[i] << ", " ;
cout << ( "}, " );
}
}
void findSubsets(vector< int > arr, int K)
{
int x = pow (2, arr.size());
for ( int i = 1; i < x; i++)
sumSubsets(arr, i, K);
}
int main()
{
vector< int > arr = { 5, 10, 12, 13, 15, 18 };
int K = 30;
findSubsets(arr, K);
return 0;
}
|
Java
import java.util.*;
class GFG {
public static void sumSubsets(
int set[], int n, int target)
{
int x[] = new int [set.length];
int j = set.length - 1 ;
while (n > 0 ) {
x[j] = n % 2 ;
n = n / 2 ;
j--;
}
int sum = 0 ;
for ( int i = 0 ; i < set.length; i++)
if (x[i] == 1 )
sum = sum + set[i];
if (sum == target) {
System.out.print( "{" );
for ( int i = 0 ; i < set.length; i++)
if (x[i] == 1 )
System.out.print(set[i] + ", " );
System.out.print( "}, " );
}
}
public static void findSubsets( int [] arr, int K)
{
int x = ( int )Math.pow( 2 , arr.length);
for ( int i = 1 ; i < x; i++)
sumSubsets(arr, i, K);
}
public static void main(String args[])
{
int arr[] = { 5 , 10 , 12 , 13 , 15 , 18 };
int K = 30 ;
findSubsets(arr, K);
}
}
|
Python3
def sumSubsets(sets, n, target) :
x = [ 0 ] * len (sets);
j = len (sets) - 1 ;
while (n > 0 ) :
x[j] = n % 2 ;
n = n / / 2 ;
j - = 1 ;
sum = 0 ;
for i in range ( len (sets)) :
if (x[i] = = 1 ) :
sum + = sets[i];
if ( sum = = target) :
print ( "{" ,end = "");
for i in range ( len (sets)) :
if (x[i] = = 1 ) :
print (sets[i],end = ", " );
print ( "}, " ,end = "");
def findSubsets(arr, K) :
x = pow ( 2 , len (arr));
for i in range ( 1 , x) :
sumSubsets(arr, i, K);
if __name__ = = "__main__" :
arr = [ 5 , 10 , 12 , 13 , 15 , 18 ];
K = 30 ;
findSubsets(arr, K);
|
C#
using System;
class GFG
{
public static void sumSubsets(
int [] set , int n, int target)
{
int []x = new int [ set .Length];
int j = set .Length - 1;
while (n > 0)
{
x[j] = n % 2;
n = n / 2;
j--;
}
int sum = 0;
for ( int i = 0; i < set .Length; i++)
if (x[i] == 1)
sum = sum + set [i];
if (sum == target)
{
Console.Write( "{" );
for ( int i = 0; i < set .Length; i++)
if (x[i] == 1)
Console.Write( set [i] + ", " );
Console.Write( "}, " );
}
}
public static void findSubsets( int [] arr, int K)
{
int x = ( int )Math.Pow(2, arr.Length);
for ( int i = 1; i < x; i++)
sumSubsets(arr, i, K);
}
public static void Main(String []args)
{
int []arr = { 5, 10, 12, 13, 15, 18 };
int K = 30;
findSubsets(arr, K);
}
}
|
Javascript
<script>
function sumSubsets(set, n, target) {
let x = new Array(set.length);
let j = set.length - 1;
while (n > 0) {
x[j] = n % 2;
n = Math.floor(n / 2);
j--;
}
let sum = 0;
for (let i = 0; i < set.length; i++)
if (x[i] == 1)
sum = sum + set[i];
if (sum == target) {
document.write( "{" );
for (let i = 0; i < set.length; i++)
if (x[i] == 1)
document.write(set[i] + ", " );
document.write( "}, " );
}
}
function findSubsets(arr, K) {
let x = Math.pow(2, arr.length);
for (let i = 1; i < x; i++)
sumSubsets(arr, i, K);
}
let arr = [5, 10, 12, 13, 15, 18];
let K = 30;
findSubsets(arr, K);
</script>
|
Output:
{12, 18, }, {5, 12, 13, }, {5, 10, 15, },
Time Complexity: 2N
Auxiliary Space: O(N)
Efficient Approach:
This problem can also be solved using Dynamic Programming. Refer to this article.
Share your thoughts in the comments
Please Login to comment...