# 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.

GeeksforGeeks has prepared a complete interview preparation course with premium videos, theory, practice problems, TA support and many more features. Please refer Placement 100 for details

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.