Я сделал так:
=================================================
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
v:array of byte;// [0..4]
s,p:integer;
t:cardinal;
begin
i:=0;
p:=30;
setlength(v,3);
for i:=0 to length(v)-1 do
v[i]:=0;
t:=windows.GetTickCount ;
repeat
if v[0]=p then begin showmessage('Приехали'); break;end;
v[length(v)-1]:=v[length(v)-1]+1;
for i:=length(v)-1 downto 1 do
begin
if (v[i]> p-1) then begin V[i-1]:=V[i-1]+1; V[i]:=0; end;
end;
s:=0;
for i:=0 to length(v)-1 do s:=s+v[i];
if s=p then begin
for i:=0 to length(v)-1 do form1.Memo1.Lines.Add(inttostr(v[i])+' ');
form1.Memo1.Lines.Append('------------------------');
form1.Memo1.Lines.Append(inttostr(s));
form1.Memo1.Lines.Append('==========================');
end;
until v[0]=p;
t:=windows.GetTickCount -t;
form1.Memo1.Lines.Append(floattostr(t/100)+' c');
end;
================================================
это означает, что имеем некий массив типа байт, и гоним все сочетания, которые могут в нём быть, и в лёт отфильтровываем те сочетания, которые в сумму дают заданное значение.
Требования такие: должна быть довольно высокая точность деления объёма. (в примере это 30 а надо где-то более 100)
Данный пример отфильтровывает нужные сочетания где-то за минуту.
Возможно ли создание гораздо более быстрого алгоритма?
Например такого, который не фильтрует из всех сочетний, а создаёт их сам?
Спасибо за ответы.
Сообщение отредактировано: volvo -