@Bobiys

Как работает программа?

Что происходит в коде этой программы, по какому принципу она выбирает числа из массива?

Задача : Даны 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", если можно, то вывести равенство. Если решение не единственное, вывести любое.

Решение, которое нашел :

spoiler
Var 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.
  • Вопрос задан
  • 338 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы