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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2022, 17:28   #1
RaZaL
Новичок
Джуниор
 
Регистрация: 14.04.2022
Сообщений: 1
По умолчанию надо разбить массив на подмассивы

есть массив, например [51, 56, 58, 59, 61], надо разбить его на подмассивы из N чисел

Например из 3(может быть любое количество): [51,56,58], [51,56,59], [51,56,61], [51,58,59], [51, 58,61], [51,59,61], [56,58,59], [56,58,61], [56,59,61], [58,59,61]

После посчитать суммы всех получившихся подмассивов и вывести сумму наибольшую возможную к заданному пределу 't', например 173
RaZaL вне форума Ответить с цитированием
Старый 15.04.2022, 09:13   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

или же ...
НАЙТИ 3(N) элемента исходного массива сумма которых НАИБОЛЕЕ приближена к t(173)/
Код:
maxdelta:=3 *100000000000000;
t:=173;
// при перестановке слагаемых ... => порядок неважен => 
for i1:=1 to M-2 do // оставить место для еще нескольких (двух)
  for i2:=i1+1 {только после использованного см. первое замечание} to M-1 do
    for i3:=i2+1 to M do
      begin 
          s:=abs( MM[i1] +MM[i2] +MM[i3] -t); //посчитали наше "приближение"
          if s<maxdelta then // нашли лучше
          begin 
            super1:=i1; 
            super2:=i2;
            super3:=i3;
          end;
      end;
writeln('super =', MM[super1] +MM[super2] +MM[super3] );
Код:
superS:=3 *1000000000000000;
...
   s:=MM[i1] +MM[i2] +MM[3];
   if abs(s-t)<abs(superS-t) then superS:=s;
...
writeln('super =', superS);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 15.04.2022 в 09:19.
evg_m вне форума Ответить с цитированием
Старый 15.04.2022, 12:21   #3
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,577
По умолчанию

А если для произвольного N ? Тут надо обеспечить генерацию сочетаний из М по N .
digitalis вне форума Ответить с цитированием
Старый 15.04.2022, 15:49   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
А если для произвольного N ?
можно и для произвольного.
http://programmersforum.ru/showthrea...t=64240&page=2
и доработать до нужного
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.04.2022, 08:37   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
superS:=MM[1]+MM[2]+MM[3]; //3 *1000000000000000;
Этого достаточно вместо плохого 3 * 1000000000000000. Иначе при:
MM[1] = 1000000000000001,
MM[2] = 1000000000000000,
MM[3] = 1000000000000000,
MM[4] = 1000000000000002,
MM[5] = 1000000000000001,
t = 1000000000000000
вы получите неверный результат.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбить массив Veryn4ik1993 Паскаль, Turbo Pascal, PascalABC.NET 7 10.01.2014 10:16
Подмассивы Alti Microsoft Office Access 1 01.10.2010 21:28
Как разбить массив PARTOS Microsoft Office Excel 3 20.11.2009 12:03
Разбить на массив spein PHP 5 09.05.2009 20:11
Как разбить число на массив? recond Общие вопросы C/C++ 15 03.02.2009 00:36