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:

filter_none

edit
close

play_arrow

link
brightness_4
code

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

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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);
    }
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

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

filter_none

edit
close

play_arrow

link
brightness_4
code

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

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.

Don’t stop now and take your learning to the next level. Learn all the important concepts of Data Structures and Algorithms with the help of the most trusted course: DSA Self Paced. Become industry ready at a student-friendly price.





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.



Article Tags :