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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2009, 17:12   #1
Vasilisk
Новичок
Джуниор
 
Регистрация: 02.08.2009
Сообщений: 5
Вопрос Пожалуйста напишите программу

Сложно объяснить, но попытаюсь:
Дается 10 чисел х1,х1,х3...х10. Нужно из предложенных чисел найти 2 суммы, ответы которых, будут как можно ближе друг к другу и являться целыми числами. Обе суммы вывести на экран.

Пример:
50; -16; 24; 10; 4; -2; 0; 6; -5; -2
Сумма всех чисел равна 69, т.е. ответы сумм должны быть 34 и 35 соответственно. Теперь находим составляющие сумм.

На экран должно вывести:
50-16-5+6+0=35
24-2-2+10+4=34
Vasilisk вне форума Ответить с цитированием
Старый 02.08.2009, 18:01   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

мне кажется, что в общем случае задача не решается...
например, даны числа 70; 0; 1; 1;1;1;1;1;1;1
сумма = 78
дальше что?....
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.08.2009, 18:13   #3
Vasilisk
Новичок
Джуниор
 
Регистрация: 02.08.2009
Сообщений: 5
По умолчанию

Цифры всегда даются такие, чтобы из них которых могли выйти равные суммы.

Последний раз редактировалось Vasilisk; 02.08.2009 в 18:16.
Vasilisk вне форума Ответить с цитированием
Старый 02.08.2009, 18:25   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
ответы которых, будут как можно ближе друг к другу и являться целыми числами.
Для варианта 70; 0; 1; 1;1;1;1;1;1;1
Сумма 1=70(или 70, или 70+0), Сумма 2= 8(0+1+1+1+1+1+1+1+1, или 1+1+1+1+1+1+1+1)
Т.е. получить 2 сочетания с минимальной разностью их сумм.
puporev вне форума Ответить с цитированием
Старый 02.08.2009, 18:26   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

я вот тут надумал алгоритмик:

Ищем максимальное число и второе по величине число в массиве, а затем записываем их в разные суммы. Потом из оставшихся чисел находим наибольшее и второе - наибольшее пишем к меньшей сумме, а второе к большей. И так до пока весь массив не перебере.

Осталась только реализация...
counter вне форума Ответить с цитированием
Старый 02.08.2009, 18:29   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вот это как раз не подойдет. Нужно сначала брать каждое число и сравнивать с суммой остальных, затем все варианты двух чисел и сумму остальных, потом трех, четырех, пяти, и искать минимальную разность сумм.
puporev вне форума Ответить с цитированием
Старый 02.08.2009, 20:13   #7
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Я бы сделал перебором всех вариантов сумм, а затем среди вариантов искал бы минимальную разность. Например, если учесть, что суммы будут состоять из равного количества слагаемых и от перестановки слагаемых сумма как известно не меняется. При n=10 значениях я насчитал 1+2+...+n/2+1=1+2+3+4+5+6=21 вариант.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 02.08.2009, 20:21   #8
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
что суммы будут состоять из равного количества слагаемых
С какой это стати?
puporev вне форума Ответить с цитированием
Старый 02.08.2009, 22:27   #9
Vasilisk
Новичок
Джуниор
 
Регистрация: 02.08.2009
Сообщений: 5
По умолчанию

пока только варианты, я тоже многое перебрал, но реализовать не могу...
И не забываем, что каждая сумма должна состоять из 5 чисел. На примере видно
Цитата:
Пример:
50; -16; 24; 10; 4; -2; 0; 6; -5; -2
Сумма всех чисел равна 69, т.е. ответы сумм должны быть 34 и 35 соответственно. Теперь находим составляющие сумм.

На экран должно вывести:
50-16-5+6+0=35
24-2-2+10+4=34

Последний раз редактировалось Vasilisk; 02.08.2009 в 22:37.
Vasilisk вне форума Ответить с цитированием
Старый 03.08.2009, 11:50   #10
NoHeart
Пользователь
 
Регистрация: 15.01.2009
Сообщений: 52
По умолчанию

Код:
uses crt;
const N=1000;
var f:text;
    arr:array [1..N] of integer;
    i,count,sum,part1,part2,max:integer;
procedure first;
var try1,try2,j,l,k1,k2:integer;
    view1,view2:array[1..n] of integer;
 begin
 try2:=0;
 try1:=0;
  j:=0;
  l:=0;
  for i:=1 to count do
   begin
  if arr[i]>=0 then
  begin
   inc(j);
   view1[j]:=arr[i];
   try1:=arr[i]+try1;
  end;
  if arr[i]<0 then
   begin
   inc(l);
   view2[l]:=arr[i];
   try2:=arr[i]+try2;
   end;
  end;
 try1:=try1-max;
 try2:=try2+max;
 if try2>=try1 then
  begin
   write(try1,'=');
    for k1:=1 to j do
     write(' ',view1[k1]);
  writeln;
   write(try2,'=');
   for k2:=1 to l do
    write(' ',view2[k2]);
 end;
end;
begin
 i:=0;
 max:=-9999;
 assign(f,'input.txt');
 reset(f);
 while not eof(f) do
  begin
   inc(i);
   read(f,arr[i]);
   if max<arr[i] then
    max:=arr[i];
   sum:=sum+arr[i];
  end;
  count:=i;
  if sum mod 2 = 0 then
   begin
    part1:=trunc(sum/2);
    part2:=part1;
   end
  else
  begin
   part1:=trunc(sum/2)+1;
   part2:=part1-1;
  end;
   first;
  readln;


end.

вот тут один из частых случаев, когда есть большое число а сумма остальных положительных чисел меньше этого числа допустим в файле входные данные 3 6 8 71 4 6 3 10 -20 -3 .
А для общего случая ничего на ум , кроме тупого перебора не приходит. То есть находим сумму всех чисел, делим ее на 2, и потом перебираем всевозможные случае сумм чисел, и какая комбинация показала наиболее близкий результат к половине суммы всех чисел, то и ответ. Вторую половину найти будет не сложно.

Последний раз редактировалось Stilet; 03.08.2009 в 12:11.
NoHeart вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
напишите программу C++ vo_sa Общие вопросы C/C++ 1 02.06.2009 18:00
Напишите программу за деньги! Nickolas1 Фриланс 2 29.04.2009 19:50
Напишите пожалуйста паскаль-программу Fylhtq Паскаль, Turbo Pascal, PascalABC.NET 3 23.04.2009 20:35
напишите программу nyncuk Помощь студентам 3 19.06.2008 14:39