# Perfect Sum Problem

• Difficulty Level : Medium
• 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++

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

## Javascript

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

My Personal Notes arrow_drop_up