|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
07.04.2011, 09:00 | #1 |
Регистрация: 07.04.2011
Сообщений: 9
|
Комбинаторика
У вас есть несколько камней известного веса W1, …, Wn. Напишите программу, которая распределит камни в две кучи так, что разность весов этих двух куч будет минимальной.
Исходные данные Ввод содержит количество камней N (1 ≤ N ≤ 20) и веса камней W1, …, Wn (1 ≤ Wi ≤ 100 000) — целые, разделённые пробельными символами. Результат Ваша программа должна вывести одно число — минимальную разность весов двух куч. Пример ___________________________ исходные данные |результат ___________________________ 5| ___________________________ 5 8 13 27 14 |3 P.S. Пыталась решить двумя способами: 1) Сортировка массива масс камней по возрастанию, а далее попеременное сложение масс камней с начала и с конца массива в две кучи (а центральные в ту кучу, где сумма масс меньше), т.е. 1 4 76 78 190 200 1 кучка | 2 куча 1 200 | 4 190 78 | 76 2) 1 2 3 4 5 6 7 Сначала сложение каждого элемента массива с одним из последующим, а сумма остальных во второй массив. После сложение каждого элемента массива со всеми последующими, а сумма остальных во второй массив. Каждый раз запоминается сумма в каждом из массивов, далее выбирается минимальное и находится вариант, при котором этот минимум был достигнут. В итоге ничто из этого нормально не работает. Если кто поможет, заранее благодарю. |
07.04.2011, 09:29 | #2 |
Форумчанин
Регистрация: 15.01.2010
Сообщений: 948
|
http://programmersforum.ru/showthread.php?t=144760
Единственно, фразу "Из оставшихся, опять беруться два и к самому лёгкому (лёгкой группе) из уже образованных, добавляется самый тыжёлый." следует читать: "из оставшихся берётся самый тяжёлый и добавляется к "более лёгкой" группе". |
07.04.2011, 09:37 | #3 |
Регистрация: 07.04.2011
Сообщений: 9
|
Спасибо за помощь неумеющему юзать поиск
Жаль C только в следующем семестре))) Если не сложно переведите на Delphi |
07.04.2011, 09:45 | #4 |
Форумчанин
Регистрация: 15.01.2010
Сообщений: 948
|
А зачем "переводить"-то? Там есть словесное описание алгоритма. Берёте и просто пишете на том языке, который знаете...
Последний раз редактировалось Vago; 07.04.2011 в 09:52. |
07.04.2011, 10:06 | #5 |
Регистрация: 07.04.2011
Сообщений: 9
|
Преподаватель сказал что нужно делать перебором и этот вариант ему не нравится
|
07.04.2011, 14:50 | #6 |
Software Developer
Участник клуба
Регистрация: 01.03.2011
Сообщений: 1,098
|
Как вариант.
Находишь общую сумму камней, делишь ее пополам -- получаешь вес кучи для идеального распределения. Сортируешь массив по убыванию. Берешь первый элемент (максимальный), если он больше или равен весу идеальной кучи -- все, поиск окончен (в первой куче будет только он, во второй -- все остальные); если нет -- вычитаешь его вес из веса идеальной кучи, остаток запоминаешь. Берешь второй элемент, если он равен остатку -- конец, идеальное распределение; если он больше остатка -- берешь следующий; если меньше -- пересчитываешь остаток и повторяешь все для следующего элемента; в идеальном случае в процессе перебора остаток должен уйти в 0. Если этого не происходит до конца перебора, запоминаешь последний остаток -- это и будет разница весов двух куч; после чего возвращаешься на шаг назад -- берешь элемент не (n), а (n+1) (то есть один элемент пропускаешь). Опять проходишь до конца перебора и сравниваешь новый остаток (разницу весов двух куч) с минимальным на данный момент. Ну и так далее... Надеюсь, я понятно озвучил идею -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв. Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062 |
07.04.2011, 15:59 | #7 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
отсюда: http://programmersforum.ru/showpost....40&postcount=7 проверил. вроде бы правильно работает. |
|
13.04.2011, 18:02 | #8 |
Регистрация: 07.04.2011
Сообщений: 9
|
Спасибо за помощь, ребята!
|
15.04.2011, 15:29 | #9 |
Регистрация: 07.04.2011
Сообщений: 9
|
опять проблема..
в этой проге (что выше) используются функции, которые мы еще не изучали => будет ясно что написано не мной. Это shl и shr. Как можно заменить их? |
15.04.2011, 15:42 | #10 | |
Старожил
Регистрация: 12.11.2010
Сообщений: 8,568
|
Цитата:
shl (сдвиг влево) эквивалентен простому умножению на 2 shr (вправо) эвивалентен целочисленному делению на 2. PS: всё выше написанное верно, если я не ошибаюсь. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Комбинаторика | kiborrgg | Помощь студентам | 6 | 25.03.2011 15:50 |
Комбинаторика | MadReason | Помощь студентам | 4 | 09.12.2010 22:52 |
Комбинаторика | Васильева Зинаида | Помощь студентам | 1 | 15.10.2010 18:55 |
Комбинаторика в Паскале | shegan | Помощь студентам | 0 | 21.12.2009 21:01 |