Насчёт количества вариантов. Их 16 (я там поправил), просто при копировании в сообщение упустил одну строку.
На самом деле это ActionScript для Flash, но все конструкции, особенно чисто вычислительные, там стандартны. А идею я же изложил. Кратный цикл, прямой подсчёт суммы и сравнение её с результатом.
При этом, конечно, просчитывается огромное количество заведомо непроходных вариантов, но для небольших значений это несущественно.
Циклы имеет смысл оптимизировать, если счёт идёт на триллионы, да и то...
Хотя вот я сейчас запустил разложение 10000 на те же слагаемые и там считалось несколько секунд. Ведь количество проверяемых вариантов увеличилось в 1000 раз. А если взять 100000, то комп задумается надолго. Но как раз в Паскале дело будет идти гораздо быстрее. Скрипт есть скрипт.
О параметрах цикла. Вот немного приукрашенный код:
Код:
N=1000;
m1=30; m2=81; m3=125;
n1=Math.floor(N/m1)+1; n2=Math.floor(N/m2)+1;n3=Math.floor(N/m3)+1;
K=0;
for (k1=0; k1<n1; k1++) {
for (k2=0; k2<n2; k2++) {
for (k3=0; k3<n3; k3++) {
NK=k1*m1+k2*m2+k3*m3;
if (Math.abs(NK-N)<2) {K=K+1;trace (NK+"="+k1+"*"+m1+"+"+k2+"*"+m2+"+"+k3+"*"+m3)}
}}}
trace ("Всего "+K+" вариантов")
1000=0*30+0*81+8*125
999=9*30+9*81+0*125
999=10*30+4*81+3*125
1001=13*30+6*81+1*125
1001=14*30+1*81+4*125
1000=25*30+0*81+2*125
Всего 6 вариантов
На Паскале цикл будет записываться так:
Код:
for k1:=1 to n1 do begin
for k2:=1 to n2 do begin
for k3:=1 to n3 do begin
....
end;
end;
end;
При желании можно вычислять параметры внутренних циклов непосредственно перед их началом, но для разовых расчётов на оптимизацию уйдёт гораздо больше времени, чем на сами расчёты
.