Задача "Выражение" на C#. Расставить знаки

Дано n (2 ≤ n ≤ 24) целых чисел x1, x2, ..., xn (0 ≤ xi ≤ 50 000 000). Расставить между ними знаки "+" и "-" так, чтобы значение получившегося выражения было равно заданному целому s (-1 000 000 000 ≤ s ≤ 1 000 000 000).

Входные данные: Первая строка содержит числа n и s. Следующая строка содержит n чисел, разделенные пробелом.

Выходные данные: Если получить требуемый результат невозможно, то вывести "No solution". Иначе вывести требуемое равенство. Если решение не единственное, то вывести любое.

Пример:

Входные данные #1
3 10
15 25 30
Выходные данные #1
15+25-30=10

Уже долго сижу с этой задачей. Решение на C#.

Вот что нарыл на языке Паскаль. Работает правильно, но медленно. Метод простого перебора. Пытался "перевести" на C#, но программа не работала. Думаю, на С# программа будет быстрее. Или нет?

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.

Ответы (0 шт):