Процедура проверки
Процедура проверки имеет вид:
procedure Check;
(* SetS, BestS, NumS, MaxS, M - глобальные *)
var i,j :integer;
begin
SetS:=[];
for i:=1 to N do
for j:=1 to N-1 do SetS:=Sets+[Q[i,j]];
SetS:=SetS+[Q[1,N]];
i:=M;
while i in SetS do Inc(i);
if i>MaxS then begin
NumS:=1;
BestS[NumS]:=S;
MaxS:=i;(* на единицу больше действительной длины *)
end
else if i=MaxS then begin Inc(NumS); BestS[NumS]:=S; end;
end;
Общая схема уточнена. Но если довести ее до программы, то решение, например, для исходных данных n=6, m=1, k=1 за реальное время не будет получено. Необходимо сокращать перебор, искать эвристики, позволяющие сделать это.
1-я эвристика. Пусть у нас есть (n-1) сектор, в которые записаны числа, образующие последовательность m, m+1, ... . количество сумм (арифметическая прогрессия) равно n*(n-1)div2, т. е. это количество различных чисел, получаемое из чисел в заполненных n-1 секторе. Обозначим через X первое число из последовательности m, m+1,
Индекс
Элементарные функции
Линейные уравнения
Нелинейные уравнения
Случайные числа