import java.util.*;
public class BacktrackingSubsets {
public static void backtrack(int[] nums, int index, List<Integer> current, List<List<Integer>> result) {
if (index == nums.length) {
result.add(new ArrayList<>(current)); // record current subset
return;
}
// Include nums[index]
current.add(nums[index]);
backtrack(nums, index + 1, current, result); // move to next element
current.remove(current.size() - 1); // backtrack: remove last added
// Exclude nums[index]
backtrack(nums, index + 1, current, result); // move to next element
}
public static void main(String[] args) {
int[] nums = {1, 2};
List<List<Integer>> result = new ArrayList<>();
backtrack(nums, 0, new ArrayList<>(), result);
for (List<Integer> subset : result) {
System.out.println(subset);
}
}
}if (index == nums.length) {
Check if we reached the end of the array to record current subset
result.add(new ArrayList<>(current)); // record current subset
Save a copy of the current subset
current.add(nums[index]);
Choose to include current element
backtrack(nums, index + 1, current, result); // move to next element
Recurse to next element after including current
current.remove(current.size() - 1); // backtrack: remove last added
Undo inclusion to try exclusion path
backtrack(nums, index + 1, current, result); // move to next element
Recurse to next element after excluding current