Реферат: Комбинаторные задачи - текст реферата. Скачать бесплатно.
Банк рефератов, курсовых и дипломных работ. Много и бесплатно. # | Правила оформления работ | Добавить в избранное
 
 
   
Меню Меню Меню Меню Меню
   
Napishem.com Napishem.com Napishem.com

Реферат

Комбинаторные задачи

Банк рефератов / Информатика, информационные технологии

Рубрики  Рубрики реферат банка

закрыть
Категория: Реферат
Язык реферата: Русский
Дата добавления:   
 
Скачать
Microsoft Word, 380 kb, скачать бесплатно
Заказать
Узнать стоимость написания уникального реферата

Узнайте стоимость написания уникальной работы

Реферат Комбинаторные задачи Содержание Введение Генерация k-элементных подмножеств Генерация всех подмножеств данного множества Генерация всех перестановок n-элементного множества Разбиения множества Заключение Литература Введение Задачи дискретной математики, к которым относится б ольшинство олимпиадных задач по информатике, часто сводятся к перебору различных комбинаторных конфигураций объектов и выбору среди них наил учшего, с точки зрения условия той или иной задачи. Поэтому знание алгори тмов генерации наиболее распространенных комбинаторных конфигураций является необходимым условием успешного решения олимпиадных задач в ц елом. Важно также знать количество различных вариантов для каждого типа комбинаторных конфигураций, так как это позволяет реально оценить вычи слительную трудоемкость выбранного алгоритма решения той или иной зад ачи на перебор вариантов и, соответственно, его приемлемость для решения рассматриваемой задачи, с учетом ее размерности. Кроме того, при решении задач полезным оказывается умение для каждой из комбинаторных конфигу раций выполнять следующие операции: по имеющейся конфигурации получат ь следующую за ней в лексикографическом порядке; определять номер данно й конфигурации в лексикографической нумерации всех конфигураций; и, нао борот, по порядковому номеру выписывать соответствующую ему конфигура цию. Генерация k-элементных подмножеств В комбинаторике такие подмножества называют сочетаниями из n элементов по k элементов и обозначают C n k . Их количество выражается следующей формул ой: Однако при программировании горазд о удобнее использовать следующие рекуррентные соотношения: Объясняется это тем, что в формуле (1) ч ислитель и знаменатель растут очень быстро, поэтому в силу особенностей компьютерной арифметики не всегда возможно точно вычислить значение C n k , даже когда последнее не превосходит максим ально представимое целое число. При фиксированном значении n максимального значения число сочетаний до стигает при k = n /2 (вернее, для четного n максимум о дин и он указан, а для нечетного — максимум достигается на двух соседних значениях k : [ n/ 2] и [ n /2]+1). Поэтому особенно полезной оказыва ется следующая оценка для четных n [4] (очевидно, что при нечетных n отличи я будут минимальными), основанная на формуле Стирлинга: Если допустить, что за время, отведенное для решения задачи, мы можем пере брать около 10 6 вариантов, то из формулы (3) следует, что генераци ю всех сочетаний из n элементов для любого фиксированного k можно п роводить для n 24. Обычно генерацию всех k -элементны х подмножеств проводят в лексикографическом порядке, тем более что в дан ном случае это не приводит ни к усложнению алгоритма, ни к увеличению его вычислительной трудоемкости. Напомним, что порядок подмножеств называ ется лексикографическим, если для любых двух подмножеств справедливо, ч то раннее должно быть сгенерировано то из них, из индексов элементов кот орого можно составить меньшее k -значное число в n -ричной сис теме счисления (или в десятичной, для n < 10). Так, для n = 6 и k = 3 сочет ание из третьего, первого и пятого элемента должно быть сгенерировано ра ньше, чем из второго, третьего и четвертого, так как 135 < 234. Рассмотрим рекурсивный алгоритм решения данной задачи. Идея сведения д анной задачи к задаче меньшей размерности следующая. Первым элементом п одмножества может быть любой элемент, начиная с первого и заканчивая ( n – k + 1)-м элементом. После того, как индекс первого эле мента подмножества зафиксирован, осталось выбрать k – 1 элемен т из элементов с индексами, большими, чем у первого. Далее поступаем анало гично. Когда выбран последний элемент, то мы достигли конечного уровня р екурсии и выбранное подмножество можно обработать (проанализировать и ли распечатать). В предлагаемой ниже программе массив a содержит значени я элементов исходного множества и может быть заполнен произвольным обр азом. В массиве p будем формировать очередное сочетание из k элементов. const nmax = 24; type list = array[1..nmax] of integer;var k,i,j,n,q : integer;a,p : list;procedure print(k : integer); var i:integer;beginfor j:=1 to k dowrite(p[j]:4);writelnend; print procedure cnk(n,k : integer);procedure gen(m,L : integer);var i:integer;beginif m=0 then print(k) elsefor i:=L to n-m+1 dobegin p[k-m+1]:=a[i]; gen(m-1,i+1) end end; gen begin cnk gen(k,1)end; cnk begin main readln(n,k);for i:=1 to n doa[i]:=i; заполнить массив можно и по - другому cnk(n,k) end. Заметим, что собственно генерация со четаний производится в рекурсивной подпрограмме gen . Она имеет следующие параметры: m - сколько элементов из множества нам еще остало сь выбрать и L - начиная с какого элемента исходного множеств а, следует выбирать эти m элементов. Обратите внимание, что именно вложе нная структура описания процедур cnk и gen позволяет не передавать при рекурс ивных вызовах значения n и k , а из ос новной программы обращаться к процедуре cnk с параметр ами, соответствующими постановке задачи, не вдаваясь в подробности ее ре шения. Такой способ будем применять и в дальнейшем. Генерация всех по дмножеств данного множества При решении олимпиадных задач чаще всего заран ее неизвестно, сколько именно элементов исходного множества должно вхо дить в искомое подмножество, то есть необходим перебор всех подмножеств . Однако, если требуется найти минимальное подмножество, то есть состоящ ее как можно из меньшего числа элементов (или максимальное подмножество ), то эффективнее всего организовать перебор так, чтобы сначала проверял ись все подмножества, состоящие из одного элемента, затем из двух, трех и т . д. элементов (для максимального подмножества — в обратном порядке). В эт ом случае, первое же подмножество, удовлетворяющее условию задачи и буде т искомым, и дальнейший перебор следует прекратить. Для р еализации такого перебора можно воспользоваться, например, процедурой cnk , опи санной в предыдущем разделе. Введем в нее еще один параметр: логическую п еременную flag , которая будет обозначать, удовлетворяет текущ ее сочетание элементов условию задачи или нет. При получении очередного сочетания вместо его печати обратимся к процедуре его проверки check , которая и будет определять значение флага. Тогда начало процедуры ge n следует переписать так: procedure gen ( m , L : integer ); var i:integer; begin if m=0 then begin check(p,k,flag); if flag then exit end else ... Далее процедура дословно совпадает с пред ыдущей версией. В основной же программе единственное обращение к данной процедуре следует заменить следующим фрагментом: k:=0; flag:=false; repeat k:=k+1; cnk( n ,1,flag) until flag or (k=n); if flag then print(k) else writeln (' no solution '); Очевидно также, что в основной программе за прос значения переменной k теперь не производится. Существует также альтернативный под ход к перебору всех подмножеств того или иного множества. Каждое подмнож ество можно охарактеризовать, указав относительно каждого элемента ис ходного множества, принадлежит оно данному подмножеству или нет. Сделат ь это можно, поставив в соответствие каждому элементу множества 0 или 1. То есть каждому подмножеству соответствует n -значное число в двоичной системе счисления (строго говоря, так как числа могут начинат ься с произвольного количества нулей, которые значащими цифрами не счит аются, то следует заметить, что в соответствие ставятся n - или менее - з начные числа). Отсюда следует, что полный перебор всех подмножеств данно го множества соответствует перебору всех чисел в двоичной системе счис ления . Теперь легко подсчитать и количество различны х подмножеств данного множества. Оно равно 2 n – 1 (или 2 n , с учетом пустого множества). Таким образом, сопоставляя два способа перебо ра всех подмножеств данного множества, мы получили следующую формулу: То есть, в рамках сделанной выше оцен ки на количество допустимых вариантов в переборе, мы можем рассмотреть в се подмножества исходного множества только при n 20. Прежде, чем перейти к рассмотрению програм м, соответствующих второму способу перебора, укажем, когда применение эт их программ целесообразно. Во-первых, данные программы легко использова ть, когда необходимо в любом случае перебрать все подмножества данного м ножества (например, требуется найти все решения удовлетворяющие тому ил и иному условию). Во-вторых, когда с точки зрения условия задачи не имеет з начения, сколько именно элементов должно входить в искомое подмножеств о. На примере такой задачи мы и напишем программу генерации всех подмнож еств исходного множества в лексикографическом порядке. Задача взята из книги [5]. Условие . Дан целочисленный массив a [1.. N ] ( N 20) и число M . Найти подмножество элементов массива a [ i 1], a [ i 2], ... a [ ik ] такое, что 1 i 1 < i 2 < i 3 < ... < ik N и a [ i 1] + a [ i 2] + ... + a [ ik ] = M . Решение . В качестве решения приведем процедуру генерац ии всех подмножеств, которые можно составить из элементов массива и функ цию проверки конкретного подмножества на соответствие условию задачи. function check(j:longint):boolean; var k:integer; s:longint; begin s :=0; for k :=1 to n do if (( j shr ( k -1)) and 1)=1 данное условие означает, что в k -й с права позиции числа j , в 2-й системе, стоит 1 then s:=s+a[k]; if s=m then begin for k:=1 to n do if ((j shr (k-1))and 1)=1 then write(a[k]:4); writeln end end; procedure subsets (n:integer) ; var q , j : longint ; begin q :=1 shl n ; та ким образом мы помещаем в q число 2^ n for j :=1 to q -1 do ци кл по всем подмножествам if check(j) then exit end; Заметим, что если все элементы в масс иве положительные, то, изменив порядок рассмотрения подмножеств, решени е приведенной выше задачи можно сделать более эффективным. Так, если сум ма элементов какого-либо подмножества уже больше, чем M , то рассмат ривать подмножества, включающие его в себя уже не имеет смысла. Пересчет же сумм можно оптимизировать, если каждое следующее сгенерированное по дмножество будет отличаться от предыдущего не более, чем на один элемент (такой способ перечисления подмножеств показан в [2]). Приведенная же прог рамма черезвычайно проста, но обладает одним недостатком: мы не можем ни в каком случае с ее помощью перебирать все подмножества множеств, состоя щих из более, чем 30 элементов, что обусловлено максимальным числом битов, отводимых на представление целых чисел в Турбо Паскале (32 бита). Но, как уже было сказано выше, на самом деле, перебор всех подмножеств у множеств бол ьшей размерности вряд ли возможен за время, отведенное для решения той и ли иной задачи. Генерация всех перестановок n -элементного множества Количество различных перестановок множества, состоящего из n элементов равно n !. В этом нетруд но убедиться: на первом месте в перестановке может стоять любой из n элемент ов множества, после того, как мы на первом месте зафиксировали какой-либо элемент, на втором месте может стоять любой из n – 1 оставшего ся элемента и т.д. Таким образом, общее количество вариантов равно n ( n – 1)( n – 2)...3 2 1 = n !. То есть рассм атривать абсолютно все перестановки мы можем только у множест, состоящи х из не более, чем 10 элементов. Рассмотрим рекурсивный алгоритм, реализующий генерацию всех перестано вок в лексикографическом порядке. Такой порядок зачастую наимболее удо бен при решении олимпиадных задач, так как упрощает применение метода ве твей и границ, который будет описан ниже. Обозначим массив индексов элем ентов — p . Первоначально он заполнен числами 1, 2, ..., n , которые в дальнейшем будут меняться местами. Параметром i рекурсивной п роцедуры Perm служит место в массиве p , начиная с кото рого должны быть, получены все перестановки правой части этого м ассива. Идея рекурсии, в данном случае следующая: на i -ом месте долж ны побывать все элементы массива p с i -го по n -й и для каждого из этих элементов долж ны быть получены все перестановки остальных элементов, начиная с ( i +1)-го мес та, в лексикографическом порядке. После получения последней из перестан овок, начиная с ( i +1)-го места, исходный порядок элементов должен бы ть восстановлен. описание переменных совпадает с приведенным выш е procedure Permutations(n:integer); procedure Perm(i:integer); var j,k:integer; begin if i=n then begin for j:=1 to n do write(a[p[j]],' '); writeln end else begin for j:=i+1 to n do begin Perm(i+1); k:=p[i]; p[i]:=p[j]; p[j]:=k end; Perm(i+1); циклический сдвиг элементов i .. n влево k:=p[i]; for j:=i to n-1 do p[j]:=p[j+1]; p[n]:=k end end; Perm begin Permutations Perm(1) end; begin Main readln(n); for i:=1 to n do p[i]:=i; a := p ; массив a может быть заполнен произвольно Permutations(n) end. Заметим, что в данной программе масси в p мо жно было и не использовать, а переставлять непосредственно элементы мас сива a . Разбиения множества Ч исло разбиений n -элементного множества н а k блоков произвольн ого размера, но таких, что кажд ый элемент множества оказывается “приписан” к одному из блоков, выражае тся числом Стирлинга второго рода S ( n , k ) [6,7]. Очевидно, что S ( n , k ) = 0 для k > n . Если согласиться, что существует только один способ разби ения пустого множества на нулевое число непустых частей, то S (0,0) = 1 (именно такая договоренност ь, как и в случае с факториалом, приводит в дальнейшем к универсальным фор мулам). Так как при разбиении непустого множества н ужна, по крайней мере, одна часть, S ( n ,0) = 0 при n > 0. О тдельно интересно также рассмотреть случай k = 2. Если непустое множество разд елили на две непустые части, то в первой части может оказаться любое подм ножество исходного множества, за исключением подмножеств, включающих в себя последний элемент множества, а оставшиеся элементы автоматически попадают во вторую часть. Такие подмножества можно выбрать 2 n -1 – 1 сп особами, что и соответствует S ( n ,2) при n > 0. Для произвольного k м ожно рассуждать так. Последний элемент либо будет представлять из себя о тдельный блок в разбиении и тогда оставшиеся элементы можно разбить уже на k – 1 частей S ( n – 1, k – 1) способами, либо поме щаем его в непустой блок. В последнем случае имеется kS ( n – 1, k ) возможных вариантов, поскольку последний элемент мы можем до бавлять в каждый блок разбиения первых n - 1 элемент ов на k частей. Таким о бразом S ( n , k ) = S ( n – 1, k – 1) + kS ( n – 1, k ), n > 0. (5) Полезными могут оказаться также формулы, связываю щие числа Стирлинга с биномиальными коэффициентами, определяющими чис ло сочетаний: Если же значение k теперь не фиксировать и рассмотреть все разбиения n -элементного множества, то их количество выражается числом Белла По формулам (7) можно подсчитать, что в рамках приняты х выше допущений можно построить все разбиения множества, состоящего не более чем из 15 элементов ( B 15 =1382958545). Перейдем теперь к рассмотрению способа генерации всех разбиений исход ного множества. Прежде всего, с ледует договориться о том, как обозначать текущее разбиение. Так как в ка ждом из разбиений участвуют все элементы исходного множества, будем в ма ссиве индексов p запис ывать в какой блок попадает каждый из элементов в текущем разбиении. Пар аметр i в рекурсивной процедуре part означает, что на текущем шаге мы именно i -ый элемент будет размещать в каждом из допустимых для него бл оков, а j как раз и опред еляет максимальный номер допустимого блока. После того, как i -ый элемент помещен в один из бло ков, рекурсивно решается такая же задача уже для следующего элемента (в д анном случае фактически работает универсальная схема перебора с возвр атом [8]). procedure partition(n : integer; var p:list); procedure part(i, j: integer); var l: integer; begin if i > n then print(n, p) else for l := 1 to j do begin p[i] := l; if l = j then part(i+1, j+1) else part(i+1, j) end end; part begin partition part (1,1) end ; Как ни странно, в данном случае процедура print оказыва ется совсем не тривиальной, если требуется печатать (или анализировать) элементы каждого из блоков разбиения в отдельности. Поэтому приведем во зможный вариант ее реализации (как и ранее, распределяли по блокам мы инд ексы, а печатаем или анализуруем сами элементы исходного массива a ): procedure print(n:integer; var p:list); var i,j,imax:integer; begin imax:=1; опреде ляем количество блоков в разбиении for i:=2 to n do if p[i]>imax then imax:=p[i]; for i:=1 to imax do цикл по блокам begin for j:=1 to n do if p[j]=i then write(a[j]:4); write(' |') блок напечатан end; writeln разбиение напечатано end; Вложенного цикла можно избежать, если требуется, на пример, подсчитать сумму элементов в каждом из блоков. Тогда, используя д ополнительный массив, мы, просматривая элементы массива a последовательно, будем увеличи вать значения суммы для блока, соответствующего рассматриваемому элем енту (аналогично операции, осуществляемой в алгоритме сортировки подсч етом). Если при этом рассматривать массив p как n -значное число n -ричной системе счисления, то можно ввести понятие лексикогра фического порядка для разбиений множества и ставить задачи определени я номера разбиения и обратную ей. Как и ранее (см. [1-3]), они решаются методом д инамического программирования и не используют непосредственную генер ацию всех разбиений. Для полноты рассмотрения данной темы самостоятельно измените процедур у partition так, чтобы она генерировала все разбиения, состоящие не более чем из k блоков. После этого н апишите процедуру разбиения множества уже на ровно k непустых частей. Олимпиадные задач и, использующие комбинаторные конфигурации Пример 1. На одном острове Новой Демократии каждый из его жителей организовал партию, которую сам и возглавил. От метим, что к всеобщему удивлению даже в самой малочисленно й партии оказалось не менее двух человек. К сожалению, финансовые трудно сти не позволили создать парламент, куда вошли бы, как предпологалось по Конституции острова, президенты всех партий. Посовещавшись, Островитян е решили, что будет достаточно, если в парламенте будет хотя бы один член к аждой партии. Помогите Островитянам организовать такой, как можно более малочисленный парламент, в котором будут представлены члены всех парти й. Исходные данные: каждая партия и, соответственно, ее президент имеют оди наковый порядковый номер от 1 до N (4 N 150). Вам даны списки всех N партий Остров а Новой Демократии. Выведите предлагаемый Вами парламент в виде списка н омеров его членов. ( Олимпиада стран С НГ , г. Могилев, 1992 г.) Решение : с теоретической точки зрения, данная задача со впадает с задачей генерации всех подмножеств из множества жителей остр ова новой демократии. Причем наиболее подходящим кажется первый подход к решению данной задачи, связанный с генераций различных сочетаний, начи ная с одного жителя. Для полноты изложения этого подхода, опишем функцию с heck , к оторую следует применить в данной задаче. Исходные данные следует запис ать в массив s : array [1..150] of set of 1..150, заполнив каждый из n первых элемен тов этого массива множеством тех партий, в которых состоит тот или иной ж итель. Тогда функция проверки сочетания из элементов этого массива прим ет следующий вид: function check(var p: list ;k:integer): boolean; var i:integer; ss:set of 1..150; begin ss:=[]; for i:=1 to k do ss:=ss+s[p[i]]; check :=( ss =[1.. n ]) end ; Как видно из описания функции, исполь зование типа “множество”, позволяет не только упростить данную програм му, но и существенно ускорить ее выполнение, по сравнению с работой с масс ивами. Однако большая размерность данной задачи не позволяет считать пр иведенное решение удовлетворительным во всех случаях. Так, уже для n = 100, пере бор всех сочетаний из 4-х и менее жителей приводит к рассмотрению около 4-х миллионов вариантов. Для построения кода, пригодного для решения данной задачи при любых входных данных, несколько изменим описание массива s : s: array[1..150] of record name,number:integer; partys : set of 1..150 end ; Здесь поле partys совпадает по смыслу с первоначальны м описанием массива s , поле name c оответствует номеру (то есть фактически имени) жителя и первоначально данное поле следует заполнить числами от 1 до n c огласно ин дексу элемента в массиве записей, и поле number соответствует количеству элемент ов во множестве из поля partys , то есть имеет смысл сразу подсчитать, в каком ко личестве партий состоит тот или иной житель. Теперь следует отсортирова ть массив s по убыванию значений поля number . Верхнюю оцен ку для числа членов парламента ( kmax ) подсчитаем, построив приближенное реше ние данной задачи следующим образом: во-первых, включим в парламент жите ля, состоящего в максимальном количестве партий, затем исключим эти парт ии из остальных множеств и заново найдем в оставшемся массиве элемент с максимальным значением поля number (уже пересчитанного) и включим его в парламе нт, и так далее, до тех пор, пока сумма значений пересчитанных полей number у жите лей, включенных в парламент, не будет равна n . Найденное ко личество членов парламента и будет kmax . Теперь следует рассматривать сочетания из ( kmax – 1) элемента, затем из ( kmax – 2) и т. д. элементов. Если для сочетаний из каког о-то рассматриваемого количества элементов k , решение найд ено не будет, то это означает, что точным является решение с количеством ч ленов парламента k +1. Так как массив s упорядочен, то , если решение для того или иного значения k существует, т о, скорее всего, оно будет найдено при рассмотрении в лексикографическом порядке первых же сочетаний по k элементов. П оэтому временная трудоемкость в переборе возникает, только если решения c данным значением k не существует . В такой ситуации можно воспользоваться следующим “ненаучным” приемом: на поиск решения для каждого k , меньшего, чем kmax отведем фиксированное количество времени, скажем, 2-3 секунды (точнее данное время стоит определить экспериментальным путем). Если за отведенное время решение не найдено, т о следует считать полный перебор невозможным и закончить выполнение пр ограммы. В любом случае, мы будем иметь какое-либо решение исходной задач и: точное или приближенное, то есть, во зможно, содержащее больше членов пар ламента, чем минимально возможно. Однако, на практике такой подход почти всегда приводит к точному решению, в силу перебора “с предпочтением”, пр оводимого для каждого k (невозможность проведения полного перебора дл я какого-либо k на практике соответствует отсутствию решения для данного k ). Пример 2. Дан автобусный билет с номером, состо ящим из N цифр. Расставить между цифрами знаки арифметич еских операций '+', '-', '*', '/' (целочисленное деление) и скобки таким образом, чтоб ы значение полученного выражения было равно 100. Можно образовывать много значные числа из стоящих рядом цифр. Выражение должно быть корректным с точки зрения арифметики. Допустимы лишние скобки, не нарушающие коррект ности выражения. При вычислениях используется стандартный приоритет о пераций, число цифр N в номере билета не больше 6. ( 5 -ая Всеросс ийск ая олимпиад а по информатике , г. Троицк, 1993 г .) Решение . для построения универсального алгоритма реше ния данной задачи будем считать слияние двух соседних цифр одной из опер аций. Тогда между каждой парой соседних цифр может стоять одна из 5 операц ий. Для N цифр получаем 5 N -1 различных вариантов расстановки операций. Перебирать все варианты расстановки операций удобнее всего с помощью р ассмотрения всех чисел в 5-ричной системе счисления, состоящих не более ч ем из N – 1 цифры, то есть для N = 6 от 00000 до 44444. Для перебора таких чисел необходимо написать процедуру прибавления 1 в 5-рич ной системе счисления. Для каждого из вариантов расстановки операций пе рейдем от исходного массива из N цифр билета, к массиву из К чисел, где K = ( N – к оличество операций слияния цифр в рассматриваемом варианте). Теперь мы д олжны рассмотреть все перестановки из K – 1 арифметической операции в данном варианте. Каждая перестановка соответствует одному из порядков выполн ения арифметических операций. Так, для 4-х чисел, перестановка номеров опе раций 3, 1, 2 означает, что сначала нужно выполнить арифметическое действие между 3-м и 4-м числом, затем между 1-м и 2-м и затем оставшееся. Если результат в ыполнения действий данного варианта в порядке, соответствующем текуще й перестановке, равен искомому числу 100, то задача решена и можно перейти к печати результата. Для данной задачи возможны и более эффективные решен ия, но в силу ее небольшой размерности, комбинаторный перебор оказываетс я вполне приемлемым. П ример 3 . Губ ернатор одной из областей заключил с фирмой " HerNet " контракт на подключение всех городов области к компьютерной сети. Сеть создается следующим образом: в области устанав ливается несколько станций спутниковой связи, и затем от каждого города прокладывается кабель до одной из станций. Технология, используемая ком панией требует при увеличении расстояния увеличения толщины кабеля. Та ким образом, стоимость кабеля, соединяющего город со станцией, при испол ьзуемой компанией технологии будет равна kL 2 , где L - расстояние от города до станц ии, а k - некий коэффици ент. Вам требуется написать программу, определяющую минимальные затрат ы компании на установку сети. Входные данные. Во входном файле записано число n (1
1Архитектура и строительство
2Астрономия, авиация, космонавтика
 
3Безопасность жизнедеятельности
4Биология
 
5Военная кафедра, гражданская оборона
 
6География, экономическая география
7Геология и геодезия
8Государственное регулирование и налоги
 
9Естествознание
 
10Журналистика
 
11Законодательство и право
12Адвокатура
13Административное право
14Арбитражное процессуальное право
15Банковское право
16Государство и право
17Гражданское право и процесс
18Жилищное право
19Законодательство зарубежных стран
20Земельное право
21Конституционное право
22Конституционное право зарубежных стран
23Международное право
24Муниципальное право
25Налоговое право
26Римское право
27Семейное право
28Таможенное право
29Трудовое право
30Уголовное право и процесс
31Финансовое право
32Хозяйственное право
33Экологическое право
34Юриспруденция
 
35Иностранные языки
36Информатика, информационные технологии
37Базы данных
38Компьютерные сети
39Программирование
40Искусство и культура
41Краеведение
42Культурология
43Музыка
44История
45Биографии
46Историческая личность
47Литература
 
48Маркетинг и реклама
49Математика
50Медицина и здоровье
51Менеджмент
52Антикризисное управление
53Делопроизводство и документооборот
54Логистика
 
55Педагогика
56Политология
57Правоохранительные органы
58Криминалистика и криминология
59Прочее
60Психология
61Юридическая психология
 
62Радиоэлектроника
63Религия
 
64Сельское хозяйство и землепользование
65Социология
66Страхование
 
67Технологии
68Материаловедение
69Машиностроение
70Металлургия
71Транспорт
72Туризм
 
73Физика
74Физкультура и спорт
75Философия
 
76Химия
 
77Экология, охрана природы
78Экономика и финансы
79Анализ хозяйственной деятельности
80Банковское дело и кредитование
81Биржевое дело
82Бухгалтерский учет и аудит
83История экономических учений
84Международные отношения
85Предпринимательство, бизнес, микроэкономика
86Финансы
87Ценные бумаги и фондовый рынок
88Экономика предприятия
89Экономико-математическое моделирование
90Экономическая теория

 Анекдоты - это почти как рефераты, только короткие и смешные Следующий
- Папа, дедушка бил тебя, когда ты был маленьким?
- Ну, конечно.
- А папа дедушки бил его, когда тот был маленьким?
- Разумеется.
- А с твоей помощью мы могли бы поломать этот наследственный садизм?
Anekdot.ru

Узнайте стоимость курсовой, диплома, реферата на заказ.

Обратите внимание, реферат по информатике и информационным технологиям "Комбинаторные задачи", также как и все другие рефераты, курсовые, дипломные и другие работы вы можете скачать бесплатно.

Смотрите также:


Банк рефератов - РефератБанк.ру
© РефератБанк, 2002 - 2016
Рейтинг@Mail.ru