Что происходит в коде этой программы, по какому принципу она выбирает числа из массива?
Задача : Даны N целых чисел X1, X2, ..., XN. Расставить между ними знаки "+" и "-" так, чтобы значение получившегося выражения было равно заданному целому S.
Входные данные
В первой строке находятся числа N и S. В следующей строке - N чисел через пробел. 2 <= N <= 24, 0 <= Xi <= 50 000 000, -1 000 000 000 <= S <= 1 000 000 000.
Выходные данные
Если получить требуемый результат невозможно, вывести "No solution", если можно, то вывести равенство. Если решение не единственное, вывести любое.
Решение, которое нашел :
spoilerVar n , i , j : longint;
a : array[1..25] of int64;
res , s : int64;
found : boolean;
Function getBit(i , j : longint) : longint;
Begin
if (i and (1 shl j)) <> 0 then
getBit := 1
else
getBit := 0;
End;
Begin
Read(n , s);
for i := 1 to n do
Read(a[i]);
for i := 0 to (1 shl (n - 1)) - 1 do begin
res := a[1];
for j := 0 to n - 2 do
if getBit(i , j) = 0 then
res := res + a[2 + j]
else
res := res - a[2 + j];
if res = s then begin
Write(a[1]);
for j := 0 to n - 2 do
if getBit(i , j) = 0 then
Write('+' , a[2 + j])
else
Write('-' , a[2 + j]);
found := true;
WriteLn('=' , s);
break;
end;
end;
if not found then
WriteLn('No solution');
End.