Cod sursa(job #2320889)

Utilizator biaiftimeIftime Bianca biaiftime Data 15 ianuarie 2019 12:21:09
Problema Submultimi Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 kb
// CPP program to find all subsets by backtracking.
#include <bits/stdc++.h>
using namespace std;
ifstream fin("submultimi.in");
ofstream fout("submultimi.out");

// 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)
{
    for (int i = index; i < A.size(); i++) {

        // include the A[i] in subset.
        subset.push_back(A[i]);
        res.push_back(subset);

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

    // include the null element in the set.
    res.push_back(subset);

    // keeps track of current element in vector A;
    int index = 0;
    subsetsUtil(A, res, subset, index);

    return res;
}

int main()
{
    int n;
    // find the subsets of below vector.
    vector<int> array ;
    fin>>n;
    for(int i=1;i<=n;i++)array.push_back(i);

    // 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);
    int i,j;
    // Print result
    for ( i = 0; i < res.size(); i++) {
        for (j = 0; j < res[i].size(); j++)
            fout<< res[i][j] << " ";
        if(j!=0) fout<<"\n";
    }

    return 0;
}