Olvidar el deshacer
static void subconjuntos(int[] a, int i, List<Integer> actual) {
if (i == a.length) { System.out.println(actual); return; }
subconjuntos(a, i + 1, actual);
actual.add(a[i]);
subconjuntos(a, i + 1, actual);
// falta: actual.remove(actual.size() - 1);
}
La lista es compartida entre todas las ramas. Sin quitar el elemento al volver, cada rama contamina a la siguiente y salen subconjuntos que no existen.
actual.add(a[i]);
subconjuntos(a, i + 1, actual);
actual.remove(actual.size() - 1); // DESHACER