Perfect Sum Problem
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++
// C++ implementation of the above approach #include <bits/stdc++.h> using namespace std; // Function to print the subsets whose // sum is equal to the given target K void sumSubsets(vector< int > set, int n, int target) { // Create the new array with size // equal to array set[] to create // binary array as per n(decimal number) int x[set.size()]; int j = set.size() - 1; // Convert the array into binary array while (n > 0) { x[j] = n % 2; n = n / 2; j--; } int sum = 0; // Calculate the sum of this subset for ( int i = 0; i < set.size(); i++) if (x[i] == 1) sum = sum + set[i]; // Check whether sum is equal to target // if it is equal, then print the subset if (sum == target) { cout<<( "{" ); for ( int i = 0; i < set.size(); i++) if (x[i] == 1) cout << set[i] << ", " ; cout << ( "}, " ); } } // Function to find the subsets with sum K void findSubsets(vector< int > arr, int K) { // Calculate the total no. of subsets int x = pow (2, arr.size()); // Run loop till total no. of subsets // and call the function for each subset for ( int i = 1; i < x; i++) sumSubsets(arr, i, K); } // Driver code int main() { vector< int > arr = { 5, 10, 12, 13, 15, 18 }; int K = 30; findSubsets(arr, K); return 0; } // This code is contributed by mohit kumar 29 |
Java
// Java implementation of the above approach import java.util.*; class GFG { // Function to print the subsets whose // sum is equal to the given target K public static void sumSubsets( int set[], int n, int target) { // Create the new array with size // equal to array set[] to create // binary array as per n(decimal number) int x[] = new int [set.length]; int j = set.length - 1 ; // Convert the array into binary array while (n > 0 ) { x[j] = n % 2 ; n = n / 2 ; j--; } int sum = 0 ; // Calculate the sum of this subset for ( int i = 0 ; i < set.length; i++) if (x[i] == 1 ) sum = sum + set[i]; // Check whether sum is equal to target // if it is equal, then print the subset 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( "}, " ); } } // Function to find the subsets with sum K public static void findSubsets( int [] arr, int K) { // Calculate the total no. of subsets int x = ( int )Math.pow( 2 , arr.length); // Run loop till total no. of subsets // and call the function for each subset for ( int i = 1 ; i < x; i++) sumSubsets(arr, i, K); } // Driver code public static void main(String args[]) { int arr[] = { 5 , 10 , 12 , 13 , 15 , 18 }; int K = 30 ; findSubsets(arr, K); } } |
Python3
# Python3 implementation of the above approach # Function to print the subsets whose # sum is equal to the given target K def sumSubsets(sets, n, target) : # Create the new array with size # equal to array set[] to create # binary array as per n(decimal number) x = [ 0 ] * len (sets); j = len (sets) - 1 ; # Convert the array into binary array while (n > 0 ) : x[j] = n % 2 ; n = n / / 2 ; j - = 1 ; sum = 0 ; # Calculate the sum of this subset for i in range ( len (sets)) : if (x[i] = = 1 ) : sum + = sets[i]; # Check whether sum is equal to target # if it is equal, then print the subset if ( sum = = target) : print ( "{" ,end = ""); for i in range ( len (sets)) : if (x[i] = = 1 ) : print (sets[i],end = ", " ); print ( "}, " ,end = ""); # Function to find the subsets with sum K def findSubsets(arr, K) : # Calculate the total no. of subsets x = pow ( 2 , len (arr)); # Run loop till total no. of subsets # and call the function for each subset for i in range ( 1 , x) : sumSubsets(arr, i, K); # Driver code if __name__ = = "__main__" : arr = [ 5 , 10 , 12 , 13 , 15 , 18 ]; K = 30 ; findSubsets(arr, K); # This code is contributed by Yash_R |
C#
// C# implementation of the above approach using System; class GFG { // Function to print the subsets whose // sum is equal to the given target K public static void sumSubsets( int [] set , int n, int target) { // Create the new array with size // equal to array set[] to create // binary array as per n(decimal number) int []x = new int [ set .Length]; int j = set .Length - 1; // Convert the array into binary array while (n > 0) { x[j] = n % 2; n = n / 2; j--; } int sum = 0; // Calculate the sum of this subset for ( int i = 0; i < set .Length; i++) if (x[i] == 1) sum = sum + set [i]; // Check whether sum is equal to target // if it is equal, then print the subset if (sum == target) { Console.Write( "{" ); for ( int i = 0; i < set .Length; i++) if (x[i] == 1) Console.Write( set [i] + ", " ); Console.Write( "}, " ); } } // Function to find the subsets with sum K public static void findSubsets( int [] arr, int K) { // Calculate the total no. of subsets int x = ( int )Math.Pow(2, arr.Length); // Run loop till total no. of subsets // and call the function for each subset for ( int i = 1; i < x; i++) sumSubsets(arr, i, K); } // Driver code public static void Main(String []args) { int []arr = { 5, 10, 12, 13, 15, 18 }; int K = 30; findSubsets(arr, K); } } // This code is contributed by 29AjayKumar |
Javascript
<script> // JavaScript implementation of the above approach // Function to print the subsets whose // sum is equal to the given target K function sumSubsets(set, n, target) { // Create the new array with length // equal to array set[] to create // binary array as per n(decimal number) let x = new Array(set.length); let j = set.length - 1; // Convert the array into binary array while (n > 0) { x[j] = n % 2; n = Math.floor(n / 2); j--; } let sum = 0; // Calculate the sum of this subset for (let i = 0; i < set.length; i++) if (x[i] == 1) sum = sum + set[i]; // Check whether sum is equal to target // if it is equal, then print the subset if (sum == target) { document.write( "{" ); for (let i = 0; i < set.length; i++) if (x[i] == 1) document.write(set[i] + ", " ); document.write( "}, " ); } } // Function to find the subsets with sum K function findSubsets(arr, K) { // Calculate the total no. of subsets let x = Math.pow(2, arr.length); // Run loop till total no. of subsets // and call the function for each subset for (let i = 1; i < x; i++) sumSubsets(arr, i, K); } // Driver code let arr = [5, 10, 12, 13, 15, 18]; let K = 30; findSubsets(arr, K); // This code is contributed by gfgking </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.