Код:
% строки - кружки, колонки - ученики, 1 - ученик посещает кружок, 0 - нет
A = [
1,0,0,0,0,0,0
1,0,0,0,0,0,0
0,1,0,0,0,0,0
0,1,1,0,0,0,0
0,0,1,1,0,0,0
0,0,0,0,1,1,0
0,0,0,0,0,1,1
0,0,1,0,1,0,1
]
% результат - массив учеников, 1 - пионер, 0 - нет
P = zeros(numel(sum(A, 1)), 1)';
while numel(A)
% номера учеников, которых принимаем в пионеры
nP = find( sum(A(find(sum(A, 2) == 1), :), 1) );
% принимаем
P(nP) = 1;
% удаляем кружки, которые посещают вновь принятые пионеры
A(find( sum(A(:, nP), 2) ), :) = [];
S = sum(A, 1);
if max(S) == numel(sum(A, 2))
% принимаем в пионеры ученика, посещающего все оставшиеся кружки
P( find(S == max(S), 1) ) = 1;
A(:, :) = [];
else
% убираем из рассмотрения первого попавшегося ученика, посещающего
% часть оставшихся кружков
A(:, find(S, 1)) = 0;
end
end
P