#include <iostream>
#include <vector>
using std::vector;
// Backtracking function to build all subsets.
// index – the next position in nums we are allowed to use
// nums – the original input list
// current – the subset being built at this moment
// result – all completed subsets collected here
void backtrack(int index, const vector<int>& nums, vector<int>& current, vector<vector<int>>& result) {
// Every state of "current" is a valid subset, so store it
result.push_back(current);
// Try adding each remaining element one by one
for (int i = index; i < nums.size(); i++) {
// Choose nums[i]
current.push_back(nums[i]);
// Explore further subsets that include nums[i]
backtrack(i + 1, nums, current, result);
// Undo the choice (backtrack)
current.pop_back();
}
}
// Wrapper function that initializes the process
vector<vector<int>> subsets(const vector<int>& nums) {
vector<vector<int>> result;
vector<int> current;
// Start building subsets from index 0
backtrack(0, nums, current, result);
return result;
}
int main() {
vector<int> nums = {1, 2, 3};
// Generate all subsets
auto res = subsets(nums);
// Print them nicely
for (auto& s : res) {
std::cout << "{ ";
for (int x : s) std::cout << x << " ";
std::cout << "}\n";
}
}
/*
run:
{ }
{ 1 }
{ 1 2 }
{ 1 2 3 }
{ 1 3 }
{ 2 }
{ 2 3 }
{ 3 }
*/