Вход


Главная страница >> Учебный процесс >> Задачник >> Олимпиадные задачи (с решениями) >> Переборные задачи >> Номер 2

[Назад]    [Содержание ]    [Вперед]

  


Номер 2


  Условие: Номер 2


Задача 2 Сгенерировать все подмножества данного n-элементного множества {0,..., n-1}.

  Решение задачи: Номер 2


Решение задачи 2. Заведем массив B[0..n] из (n+1) элемента. B[i]=0, если i-ый элемент в подмножество не входит, и B[i]=1 иначе. Т.о. пустому подмножеству будет соответствовать набор из n нулей, а n-элементному подмножеству - набор из n единиц. Тут явно заметна связь подмножества с двоичным представлением числа. Алгоритм: будем генерировать числа от 0 до 2n-1, находить их двоичное представление, и формировать подмножество из элементов с индексами единичных битов в этом представлении. Но число 2n-1 может не поместиться в разрядную сетку машины. Поэтому генерацию будем проводить, используя массив B: Сначала B[i]=0 для всех i, что соответствует пустому подмножеству. Будем рассматривать массив B как запись двоичного числа B[N]...B[1]B[0], и моделировать операцию сложения этого числа с единицей. При сложении будем просматривать число справа налево заменяя единичные биты нулями до тех пор, пока не найдем нулевой бит, в который занесем 1. Генерация подмножеств заканчивается, как только B[N]=1 (предыдущая конфигурация была 1...12 = 2n-1). while B[N]<>0 do begin i:=0; { индекс бита двоичного числа } while (B[i]=1) do begin B[i]:=0; { моделируем перенос в следующий разряд, } i:=i+1 { возникающий при сложении } end; B[i]:=1; { Распечатываем индексы единичных элементов массива B -новое сгенерированное подмножество } For i:=0 to N-1 do if B[i]=1 then write(i); writeln; { переход на новую строку при печати } end;

Назад



[Назад]    [Содержание ]    [Вперед]

  


  
За содержание страницы отвечает Гончарова М.Н.
©
Кафедра СПиКБ, 2002-2017