Backtracking to find all subsets

Given a set of positive integers, find all its subsets.
Examples:

Input : 1 2 3
Output :     // this space denotes null element. 
         1
         1 2
         1 2 3
         1 3
         2
         2 3
         3

Input : 1 2
Output : 
         1 
         2
         1 2

We have already discussed iterative approach to find all subsets. This article aims to provide a backtracking approach.

Idea is that if we have n number of elements inside an array, we have exactly two choices for each of the elements. Either we include that element in our subset or we do not include it.

C++



filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP program to find all subsets by backtracking.
#include <bits/stdc++.h>
using namespace std;
  
// In the array A at every step we have two
// choices for each element either  we can
// ignore the element or we can include the
// element in our subset
void subsetsUtil(vector<int>& A, vector<vector<int> >& res,
                 vector<int>& subset, int index)
{
    res.push_back(subset);
    for (int i = index; i < A.size(); i++) {
  
        // include the A[i] in subset.
        subset.push_back(A[i]);
  
        // move onto the next element.
        subsetsUtil(A, res, subset, i + 1);
  
        // exclude the A[i] from subset and triggers
        // backtracking.
        subset.pop_back();
    }
  
    return;
}
  
// below function returns the subsets of vector A.
vector<vector<int> > subsets(vector<int>& A)
{
    vector<int> subset;
    vector<vector<int> > res;
  
    // keeps track of current element in vector A;
    int index = 0;
    subsetsUtil(A, res, subset, index);
  
    return res;
}
  
// Driver Code.
int main()
{
    // find the subsets of below vector.
    vector<int> array = { 1, 2, 3 };
  
    // res will store all subsets.
    // O(2 ^ (number of elements inside array))
    // because at every step we have two choices
    // either include or ignore.
    vector<vector<int> > res = subsets(array);
  
    // Print result
    for (int i = 0; i < res.size(); i++) {
        for (int j = 0; j < res[i].size(); j++)
            cout << res[i][j] << " ";
        cout << endl;
    }
  
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 program to find all subsets
# by backtracking. 
  
# In the array A at every step we have two 
# choices for each element either we can 
# ignore the element or we can include the 
# element in our subset 
def subsetsUtil(A, subset, index):
    print(*subset)
    for i in range(index, len(A)): 
          
        # include the A[i] in subset. 
        subset.append(A[i])
          
        # move onto the next element. 
        subsetsUtil(A,subset, i + 1
          
        # exclude the A[i] from subset and 
        # triggers backtracking.
        subset.pop(-1
    return
  
# below function returns the subsets of vector A. 
def subsets(A):
    global res
    subset = []
      
    # keeps track of current element in vector A 
    index = 0
    subsetsUtil(A, subset, index) 
      
# Driver Code
  
# find the subsets of below vector. 
array = [1, 2, 3]
  
# res will store all subsets. 
# O(2 ^ (number of elements inside array)) 
# because at every step we have two choices 
# either include or ignore. 
subsets(array) 
  
# This code is contributed by SHUBHAMSINGH8410

chevron_right



Output:


1 
1 2 
1 2 3 
1 3 
2 
2 3 
3 

Time Complexity : O(2 ^ n)



My Personal Notes arrow_drop_up

Interested in problems and solving them

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.