Здесь я объяснил это подробно.
Делайте upvote, если вам нравится пост в блоге.
http://cod3rutopia.blogspot.in/
В любом случае, если вы не можете найти мой блог, вот объяснение.
Это проблема рекурсивного характера.
По существу, для элемента, присутствующего в подмножестве, есть 2 варианта:
1) присутствует в наборе
2) Отсутствует в наборе.
По этой причине набор из n чисел имеет 2 ^ n подмножеств (2 варианта на элемент)
Вот псевдокод (C ++) для печати всех подмножеств, за которым следует пример, объясняющий, как работает код.
1) [] - это массив чисел, подмножества которых вы хотите узнать.
2) bool a [] - массив логических значений, где a [i] сообщает, присутствует ли число A [i] в наборе или нет.
print(int A[],int low,int high)
{
if(low>high)
{
for(all entries i in bool a[] which are true)
print(A[i])
}
else
{set a[low] to true //include the element in the subset
print(A,low+1,high)
set a[low] to false//not including the element in the subset
print(A,low+1,high)
}
}