print2. Комбинаторные объекты

printГенерация подмножеств

var a:array[1..20] of integer; { множество заданных значений }
                               { одинаковых элементов нет }
    n:integer; { количество элементов в множестве }
    b:array[1..20] of boolean; { флаг, входит ли a[i] в подмножество }
procedure gen(i:integer);
var j:integer;
begin
  if i>n then { завершение рекурсии }
  begin
    { обработка полученного подмножества, например, печать }
    for j:=1 to n do
      if b[j] then
        write(' ',a[j]);
      writeln;
    exit;
  end;
  b[i]:=false; { i-й элемент не включаем в подмножество }
  gen(i+1); { и рассматриваем все варианты для этого случая }
  b[i]:=true; { i-й элемент включаем в подмножество }
  gen(i+1); { и рассматриваем все варианты для этого случая }
end;
Вызов подпрограммы в основной программе выполняется так:
gen(1);
На каждом уровне рекурсии происходит выбор из двух вариантов, всего уровней `n`. Таким образом генерируется `2^n` различных подмножеств.

Пример применения:
Разбор задачи 592. Головоломка
loading