Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.01.2008, 19:07   #1
Elm0
ObjectPascal,CISCO
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 294
По умолчанию значение получившегося выражения должно быть равно заданному целому S

Посмотрите плз задачку.я для общего развития серого вещества, решаю задачки.Вот тормознул на этой:

Даны N целых чисел X1, X2,...,Xn. Расставить между ними + и - так ,чтобы значение получившегося выражения было равно заданному целому S.
ПРИМЕР
Вводим N=3 S=10
вводим 3 значения N- 15 ,25,30
Вывод 15+25-30=10

Если комбинацию найти нельзя, то выводим соответств. сообщение.

Алгоритм я понимаю но...не понимаю как осуществить перебор в массиве...может case'ом?
Elm0 вне форума Ответить с цитированием
Старый 16.01.2008, 19:12   #2
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Код:
может case'ом?
Только количество чисел заранее неизвестно... Case тут не поможит, тут рекурсионный перебор надо делать... Сейчас покумекаю... Может код скину!
Я не маюсь бездельем, я от него тащусь!
Tayfun вне форума Ответить с цитированием
Старый 16.01.2008, 19:26   #3
Alex21
With best regards
Участник клуба
 
Регистрация: 20.04.2007
Сообщений: 1,448
По умолчанию

Смотрим здесь. Страница 47-48.
Alex21 вне форума Ответить с цитированием
Старый 16.01.2008, 19:34   #4
Tayfun
Форумчанин
 
Аватар для Tayfun
 
Регистрация: 24.06.2007
Сообщений: 351
По умолчанию

Цитата:
Смотрим здесь. Страница 47-48.
Интересный вариант... Предлагаю альтернативный.
Отказался от рекурсии, можно гораздо проще
Код:
program znaki;
uses crt;
const max_n=100;
var
ss,s:integer;
a:array[1..max_n] of integer;
b:array[1..max_n] of byte;
n,i,j:integer;
bb:boolean;
begin
clrscr;
randomize;
writeln('VVEDITE KOLICHESTVO CHISEL');
readln(n); {Вводим количество эллементов массива}
for i:=1 to n do begin {Случайным образов генерируем массив [0;99]}
a[i]:=random(100);
write(a[i],' ');
end;
writeln;
writeln('VVEDITE CHISLO');
readln(s); 
while b[n]=0 do begin {Цыкл влючающий в себя генератор знаков и проверку. Получаеться ли нужное нам число}
b[1]:=b[1]+1;{* Здесь происходит генерация знаков}
for i:=1 to n-1 do
if b[i]>1 then begin b[i]:=b[i]-2; b[i+1]:=b[i+1]+1; end; {*}

ss:=a[1]; {$Находим разность или сумму чисел массива}
for i:=1 to n-1 do
case b[i] of
0:ss:=ss-a[i+1]; {Нулю соответствует знак минус, а еденица плюсу}
1:ss:=ss+a[i+1];
end;

if ss=s then begin bb:=true; {Проверяем получаеться ли наше число, если да, то выводим всю последовательность со знаками}
for i:=1 to n-1 do begin write(a[i]);
case b[i] of
0:write('-');
1:write('+');
end;
end;
write(a[n]);
end;
end;
if bb=false then writeln('PREDSTAVITY NEVOZMOJNO');
readkey;
end.
Основным являеться массив "B" именно в нем происходит генерация знаков. Как уже было сказано, нулю соответствует знак минус, еденича соответствует плюсу. Вот пример работы массива в ходе поиска последовательности
0,0,0,0,0,...,0 -Всеминусы
1,0,0,0,0,....,0 - Один плюс на первой позиции
0,1,0,0,0,....,0 - Один плюс на второй позиции
1,1,0,0,0,....,0 - Два плюса...
0,0,1,0,0,.....,0 -Один, на 3 позиции
................................... ................................
1,1,1,1,1,.....,1 - Все плюсы
Я не маюсь бездельем, я от него тащусь!

Последний раз редактировалось Tayfun; 17.01.2008 в 18:27. Причина: Добавляю коментарии
Tayfun вне форума Ответить с цитированием
Старый 16.01.2008, 21:06   #5
Elm0
ObjectPascal,CISCO
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 294
По умолчанию

Не могли бы вы выложенный Вами код пополнить комментариями.

Был бы очень благодарен.
Elm0 вне форума Ответить с цитированием
Старый 17.01.2008, 17:09   #6
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Предлагаю ускорить немного ускорить алгоритм
Код:
const nm=100;
var a:array[0..nm] of integer;
    b:array[1..nm] of boolean;
    i,j,n,s,ss:integer;
    timeold:longint;
    timereal:longint absolute $40:$6c;
    bb:boolean;
begin
  readln(n);
  randomize;
  for i:=1 to n do
    begin
      a[i]:=round(random*100)+1;
      write(a[i], ' ');
    end;
    writeln;
  readln(s);

timeold:=timereal;

  fillchar(b,sizeof(b),false);
  bb:=faLse;
  repeat
    for i:=1 to n do
      begin
        if not b[i] then
          begin
            b[i]:=true;
            break;
          end
        else b[i]:=false;
      end;

    ss:=a[0];
    for i:=1 to n do
      case b[i] of
        true:ss:=ss+a[i];
        false:ss:=ss-a[i];
      end;

    if s=ss then
     begin
       write(a[1]);
       bb:=true;
       for i:= 1 to n do
         begin
           case b[i] of
             true:write('+');
             false:write('-');
           end;
           write(a[i]);
         end;
       writeln;
     end;
  until b[n];
  if not bb then writeln('no');
writeln((timereal-timeold)/100:0:3);
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 18.01.2008, 00:13   #7
Elm0
ObjectPascal,CISCO
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 294
По умолчанию

Большое всем спасибо за помощь!!!
Elm0 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Процесс - на вкладке процессы, напротив процесса программы должно быть написано SYSTEM Terran Общие вопросы Delphi 3 10.01.2008 21:03
Регулярные выражения Adamant Общие вопросы C/C++ 1 26.11.2007 19:44
TStringGrid - изначально мы видим одну ячейку в конце должно быть столько сколько заполнили. Ensoph Компоненты Delphi 5 18.10.2007 22:24