# 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}
```

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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 ` ` `  `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 `

Output:

```{12, 18, }, {5, 12, 13, }, {5, 10, 15, },
```

Time Complexity: 2N

Efficient Approach:
This problem can also be solved using Dynamic Programming. Refer to this article.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.