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

printРазбор задачи 1201. Подарки

Если мы выбрали `k` классов, то для получения числа вариантов нужно перемножить число категорий в выбранных классах.
Для получения общего количества вариантов нужно просуммировать число вариантов по всем наборам из `k` классов.
var
 s:int64; { Общее количество вариантов }
 a:array[1..20] of integer;
 b:array[1..20] of boolean;
 k,n,j:integer;
procedure gen(i,m:integer);
var
  j:integer;
  p:int64;
begin
  if i>n then
  begin
    p:=1;
    for j:=1 to n do
      if b[j] then
        p:=p*a[j]; { перемножаем число вариантов для выбранных k классов }
    s:=s+p; { добавляем к общему итогу }
    exit;
  end;
  if (n-i)>=(k-m) then
  begin
    b[i]:=false;
    gen(i+1,m);
  end;
  if m<k then
  begin
    b[i]:=1;
    gen(i+1,m+1);
  end;
end;
begin
  readln(n,k);
  for j:=1 to n do
    read(a[j]);
  gen(1,0);
  writeln(s);
end.
loading