// Задача о ранце. В массиве B заданы веса предметов.
// Выдать все варианты полной комплектации ранца частью этих предметов
const Sz=100;

type IntArr = array [1..Sz] of integer;

procedure PrintArr(const A: IntArr; n: integer);
begin
  for var i:=1 to n do
    Print(A[i]);
  Println;
end;

procedure TrySolve(n: integer; const B: IntArr; nb: integer);
var
  Subset: IntArr;
  space: integer;
  ns: integer;

  procedure TrySolve0(i: integer);
  begin
    if space=0 then 
      PrintArr(Subset,ns)
    else if (space<0) or (i>nb) then 
      exit // отсечение
    else // продолжение перебора всех подмножеств множества B
    begin
      TrySolve0(i+1); // попробовать не взять i-тый элемент

      ns += 1; 
      Subset[ns] := B[i]; 
      space := space - B[i];
      TrySolve0(i+1); // попробовать взять i-тый элемент
      space := space + B[i]; 
      ns -= 1;
    end;
  end;
  
begin
  space:=n;
  TrySolve0(1);
end;

procedure FillArr(var B: IntArr; var n: integer);
begin
  n:=5; // количество предметов
  B[1]:=8; B[2]:=5; B[3]:=13; B[4]:=3; B[5]:=15; // веса предметов
end;

var
  B: IntArr;
  nb: integer;

begin
  FillArr(B,nb);
  TrySolve(23,B,5);
end.
