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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2013, 12:19   #11
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Количество способов разбивки С(1,n)+C(2,n)+..+C(n mod 2,n). Если и ошибся, то думаю не кардинально. Здесь C(i,n)=n!/((n-i)!*i!). А теперь представте 100 предметов и C(50,100)=100!/(50!*50!). 100! это число примерно со 158 цифрами. Сколько лет потребуется компьютеру для расчета всех способов разбивки? (или вернее миллионов лет)
(50,100)=100!/(50!*50!)
это
100891344545564193334812497256 случаев.
Я не думаю, что дольше 30 секунд должно считать...
Точнее не так :-D Максимальное время за которое должно высчитывать - 30 секунд.

Код первой косячной программы:

Код:
uses crt;
  var a: array[1..101] of integer;
  i,N,sum1,sum2,raz: integer;
  f: boolean;
  c: integer;


begin
clrscr;
Readln (N);

For i:=1 to N do begin
Read (a[i]);
end;

repeat
  f:=false;
  for i:=1 to N-1 do
  begin
    if a[i]>a[i+1] then
    begin
      f:=true;
      c:=a[i];a[i]:=a[i+1];a[i+1]:=c;
    end;
  end;
until not f;

For i:=1 to N do begin
If (i div 2)=0 then
sum2:=sum2+a[i]
else
sum1:=sum1+a[i];
end;

raz:=abs(sum2-sum1);

WriteLn (raz);

Readln (N);
end.

Последний раз редактировалось Rhc; 31.12.2013 в 12:22.
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 12:37   #12
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Я не думаю, что дольше 30 секунд должно считать...
Вы не правы... На более-менее мощной машине мы можем сделать около 20-50 млн. операций за секунду.. Так что тут будет огромное время..
Poma][a вне форума Ответить с цитированием
Старый 31.12.2013, 12:46   #13
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Вы не правы... На более-менее мощной машине мы можем сделать около 20-50 млн. операций за секунду.. Так что тут будет огромное время..
А если программа отправляется на сервер и в условии сказано, что не более 30 секунд?)
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 13:02   #14
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Аватар разговариает про общую формулу..
У Вас всё гораздо прозаичнее..
у Вас N предметов..
Каждый может быть или в 1-ой или во 2-ой группе
Всего 2^N вариантов.. (кажется)..
Poma][a вне форума Ответить с цитированием
Старый 31.12.2013, 13:08   #15
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Аватар разговариает про общую формулу..
У Вас всё гораздо прозаичнее..
у Вас N предметов..
Каждый может быть или в 1-ой или во 2-ой группе
Всего 2^N вариантов.. (кажется)..
Нет, он прав.
У нас 100 элементов (Берём максимум, чтоб понимать с чем имеем дело),
а второй массив, в который буду влетать возможные варианты - 50.
Чтобы подсчитать количество возможных случаев используется формула:
Цитата:
C(i,n)=n!/((n-i)!*i!)
.
Из этого можно только учесть, что если количество элементов будет нечётное, то второй массив округляем в меньшую сторону, чтобы меньше случаев было.
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 13:10   #16
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Всего 2^N вариантов.. (кажется)..
Вот именно, что кажется. Думаю что не так.
В группе 1 предмет - С(1,n)
В группе 2 предмета - С(2,n)
...
В группе n div 2 предметов - С(n div 2,n)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.12.2013, 13:11   #17
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Ну ладно, разобрались. Как теперь сделать код для такого
перебора?
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 13:34   #18
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Вот именно, что кажется. Думаю что не так.
В группе 1 предмет - С(1,n)
В группе 2 предмета - С(2,n)
...
В группе n div 2 предметов - С(n div 2,n)
Причем тут сочетания?
Да мы можем выбрать 2 предмета из N С(2, n) способами
Но причем это тут?

Ладно..
Не проверял..
Код:
uses Math;

var
	a : array [1..100] of Integer;
	n, m : Integer;
procedure P(k, s1, s2 : Integer);
begin
	if k = n+1 then begin
		m := Min(m, Abs(s1-s2));
		Exit
	end;
		
	P(k+1, s1+a[k], s2);
	P(k+1, s1, s2+a[k])
end;

var
	i : Integer;
	
begin
	ReadLn(n);
	m := MaxInt;
	for i := 1 to n do
		Read(a[i]);
		
	P(1, 0, 0);
	WriteLn(m)
end.
Poma][a вне форума Ответить с цитированием
Старый 31.12.2013, 13:44   #19
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
Радость

Цитата:
Сообщение от Poma][a Посмотреть сообщение
Причем тут сочетания?
Да мы можем выбрать 2 предмета из N С(2, n) способами
Но причем это тут?

Ладно..
Не проверял..
Код:
uses Math;

var
	a : array [1..100] of Integer;
	n, m : Integer;
procedure P(k, s1, s2 : Integer);
begin
	if k = n+1 then begin
		m := Min(m, Abs(s1-s2));
		Exit
	end;
		
	P(k+1, s1+a[k], s2);
	P(k+1, s1, s2+a[k])
end;

var
	i : Integer;
	
begin
	ReadLn(n);
	m := MaxInt;
	for i := 1 to n do
		Read(a[i]);
		
	P(1, 0, 0);
	WriteLn(m)
end.
Ничего себе, работает! А можно комментарии к ней?
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 13:46   #20
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
Ничего себе, работает! А можно комментарии к ней?
Неа............
Poma][a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задача:задать два смежных графа,провести операции над ними пересечение ,объединение и разность dgulij Паскаль, Turbo Pascal, PascalABC.NET 0 14.05.2013 17:32
Мне надо сделать так что бы на главной странице картинка была по центру и под ней находился текст Чайник = ) HTML и CSS 1 21.10.2010 18:39
разделить элементы данного массива на три подмассива с одинаковой суммой элементов astr_al Помощь студентам 3 19.12.2009 20:05
Вычислить максимальную разность между К и суммой двух соседних эллементов массива. Luska Помощь студентам 3 22.03.2009 19:22