Курсовая работа: Перебор с возвратом
Num:=ch;
end;
procedure Init;{предполагается, что данные корректны и во входном файле они организованы так, как представлены в примере из формулировки задачи}
begin
readln(N);{числожителей}
for i:=1 to N do with A[i] do begin man:=i; part:=[i]; end;{каждыйжительпредставляетсвоюпартию}
for i:=1 to N do begin
while Not eoln do begin read(t);A[t].part:=A[t].part+[i];{житель t представляетпартиюсномером i, илипартиясномером i представленажителем t}
end;
readln;
end;
for i:=1 to N do A[i].number:=Num(A[i].part);
end;
Следующим очевидным шагом является сортировка массива А по значению поля number. Становится понятным и необходимость ввода поля man в структуру записи - после сортировки номер элемента массива А не соответствует номеру жителя острова.
Пока не будем задумываться о том, как сократить перебор. Попытаемся набросать общую схему. Используемые переменные достаточно очевидны, они описываются в процессе их ввода, присвоение начальных значений глобальным переменным осуществляется в процедуре Init .
procedure Include(k:Nint);{включениеврешение}
begin
Rwork:=Rwork+[A[k].man];
Inc(mn);
end;
procedure Exclude(k:Nint);{исключитьизрешения}
begin
Rwork:=Rwork-[A[k].man];
Dec(mn);
end;
procedure Solve(k:Nint;Res,Rt:Sset);
{k- номер элемента массива А; Res - множество партий, которые представлены в текущем решении; Rt - множество партий, которые следует “покрыть” решением; min - минимальное количество членов в парламенте; mn - число членов парламента в текущем решении; Rbest - минимальный парламент; Rwork - текущий парламент; первый вызов - Solve(1,[],[1..N])}
var i:Nint;
begin
блокобщихотсечений |