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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2011, 20:26   #1
niki123
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 16
По умолчанию Разделение предметов по весу

Здравствуйте.
Подскажите алгоритм решения вот такой задачи.
Цитата:
Имеется N предметов, веса которых равны W1, W2, . . . , WN. Разделить эти предметы на две группы так, чтобы общие веса групп были максимально близки.
Я как то не совсем понимаю как организовать перебор значений.
niki123 вне форума Ответить с цитированием
Старый 31.03.2011, 20:54   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Перебор сдесь не поможет. При большом количестве предметов возникнет "информационный фзрыв". Поступают примено так:
Массив, сортируется по весам
Выбираются два самых тыжеловесных предмета и суммируются в две переменные.
Из оставшихся, опять беруться два и к самому лёгкому (лёгкой группе) из уже образованных, добавляется самый тыжёлый.
Так поступаем до опустошения исходного массива.
Веса полученных, будут макимально равны.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 31.03.2011 в 23:54.
Smitt&Wesson вне форума Ответить с цитированием
Старый 31.03.2011, 22:06   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Smitt&Wesson
у этого алгоритма есть название? просто интересно. с виду какой то жадный алгоритм равномерного распределения)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 31.03.2011, 23:52   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2Smitt&Wesson
у этого алгоритма есть название? просто интересно. с виду какой то жадный алгоритм равномерного распределения)
Да, согласен, жадноват он (названия не помню, просто где-то вычитал). Эту задачку можно решить, например, целочисленным симплекс-методом, но он в реализации довольно сложен, а этот "жадный" очень просто решить при помощи одного массива и двух реременных.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.04.2011, 06:15   #5
niki123
Пользователь
 
Регистрация: 12.03.2011
Сообщений: 16
По умолчанию

Спасибо за ответ.
Цитата:
Из оставшихся, опять беруться два и к самому лёгкому (лёгкой группе) из уже образованных, добавляется самый тыжёлый.
"Беруться два" тяжелый добавляется к легкой группе, а легкий добавляется к тяжелой группе? Но тогда алгоритм работать не будет или я что то не так понял.
niki123 вне форума Ответить с цитированием
Старый 01.04.2011, 10:39   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от niki123 Посмотреть сообщение
Спасибо за ответ.

"Беруться два" тяжелый добавляется к легкой группе, а легкий добавляется к тяжелой группе? Но тогда алгоритм работать не будет или я что то не так понял.
Вы всё правильно поняли. Почему не будет? Поэкспериментируйте с монетками разного достоинства.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 01.04.2011, 11:11   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

niki123, задачу эту для чего решаете? (цель какую пытаетесь достигнуть, какой результат получить? ) N какой максимальной величины может быть?

Дело в том, что оптимальное решение может дать ТОЛЬКО перебор!
Все остальные методы могут дать тольк весьма и весьма приближённое к оптимальному...

Цитата:
Сообщение от Smitt&Wesson
Вы всё правильно поняли. Почему не будет?
Smitt&Wesson, распишите, пожалуйста, Ваш алгоритм на простейшем примере.
есть веса: 15 11 8 8 8 2
очевидно, что решение две кучки по 26 (15+11) и (8+8+8+2)
а по Вашему алгоритму как получается?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2011, 11:34   #8
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

из его решения выходит 25 и 27,
этот алгоритм по-моему неплох, при увеличении количества элементов, разница между группами (по отношению к размерам групп) будет если не уменьшаться то невелика
onewho вне форума Ответить с цитированием
Старый 01.04.2011, 13:49   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

onewho, ага. а если взять 17 15 11 11 10 (разделение по 32: 17+15 и 11+11+10), то алгоритм даст 17 + 11 = 28 и 15+11+10=36 - отклонение в 4 единицы при оптимальном распределении 32 единицы. 12.5% погрешность..

Впрочем. согласен, если не стоит задача найти оптимальное распределение - то алгоритм крайне эффективен и вполне может быть использован практически. (тем более, что для сравнительно больших N результат перебор может занять ОЧЕНЬ продолжительное время!)

Последний раз редактировалось Serge_Bliznykov; 01.04.2011 в 13:51.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.04.2011, 14:23   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Разделить эти предметы на две группы так, чтобы общие веса групп были максимально близки.
По условию задачи, именно максимально близки, а не оптимальны.
Для оптимального решения (кроме перебора) существует алгоритм "поиск с возвращениями" на гра'фе.
Я тоже о нём подумал вначале, но учитывая уровень подготовки топикстартера и условие задачи, предложил именно этот.
Он не так эффективен, зато прост в реализации. Да и по скорости он быстрее чем обход графа.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 01.04.2011 в 14:28.
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура данных для хранения предметов L_M Gamedev - cоздание игр: Unity, OpenGL, DirectX 5 15.11.2010 21:08
разделение чисел Михаил2261 Microsoft Office Excel 4 07.09.2010 12:35
Составьте запрос, который позволяет подсчитать в таблице Экзамен количество различных предметов обучения. настенка=) Помощь студентам 3 26.05.2010 03:16
Разделение. Maksim_27_10 Общие вопросы C/C++ 8 21.04.2010 20:40
Задача на С++. формирование выбора предметов Veina Помощь студентам 9 23.12.2009 00:39