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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2013, 19:41   #1
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
Сообщение Задача на паскале: Разделить элементы массива на 2 группы так, что бы разность между ними была минимальна.

Всем привет! Помогите оформить или подсказать код к вот такой задаче:

1. Вводится число, означающее количество элементов массива.
2. Разделить элементы массива на 2 группы так, что бы разность между ними была минимальна.
Например, вводим:
3
1 3 5
Получаем:
1
Или ещё
4
1 1 1 1
Получаем:
0

Как я решил эту задачу:
(Допустим, входные данные были:
3
1 3 5)
1. Ищем сумму и делим на два (1+3+5)/2=4,5.
2. Нужен массив, длина которого будет в 2 раза меньше, чем длина введённого.
2.1. Если длина массива нечётная, то округлить длину массива в меньшую сторону.
3. "Засовываем" все возможные комбинации чисел в наш обрезанный массив и искать разность чисел с тем, что получилось в п. 1.
3.1. Разность брать по модулю, чтобы не было геморроя.
4. Наименьшая возможная разность и будет решением, но не будет ответом, так как ответом будет эта минимальная разность умноженная на два.

Как теперь всё это оформить в виде кода?
Rhc вне форума Ответить с цитированием
Старый 30.12.2013, 20:00   #2
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

по-моему вы не верно понимаете условия задачи
Цитата:
2. Разделить элементы массива на 2 группы так, что бы разность между ними была минимальна.
надо не делить сумму элементов на 2, а только разделить массив на 2 массива(группы) по одному критерию - "разности". Эти два массива и будут ответом на задачу.

Вот только не понятно какая разность имеется ввиду?
а) разность суммы элементов в группах
или
б) разность между количеством элементов в группах
Что бы еще такого сделать, чтобы ничего не делать?

Последний раз редактировалось DpolenST; 30.12.2013 в 20:05.
DpolenST вне форума Ответить с цитированием
Старый 30.12.2013, 20:04   #3
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от DpolenST Посмотреть сообщение
по-моему вы не верно понимаете условия задачи
надо не делить сумму элементов на 2, а разделить массив на 2 массива(группы).

Вот только не понятно какая разность имеется ввиду?
а) разность суммы элементов в группах
или
б) разность между количеством элементов в группах
а)

Т.е. a[1]:=1 a[2]:=3 a[3]:=5 а сумма будет 9
У меня там не условие идёт, а моё решение . Там же ниже написал, что
потом я беру массив (в теории: кода нет), который в два раза меньше входного и округляю его в нечётную
сторону (чтобы памяти меньше использовалось).
Rhc вне форума Ответить с цитированием
Старый 30.12.2013, 20:21   #4
DpolenST
Форумчанин
 
Регистрация: 28.09.2013
Сообщений: 115
По умолчанию

1. Сортировать элементы основного массива по убыванию
2. Найти минимальную разность двух массивов
Основная идея поиска состоит в том, что берется максимальный элемент (после сортировки он у нас на "0" месте) в первый массив, второй во второй, находится разница сумм элементов, если разница больше нуля, то есть во втором массиве элемент меньше чем в первом, то во второй массив добавляется еще один элемент, если же разность снова положительная значит во второй массив добавляется еще один элемент и так далее пока разность не будет отрицательна, это как раз и значит, что во втором массиве сумма элементов превысила сумму элементов первого массива, значит следующий элемент нужно добавить в первый массив

Это не совсем полноценный вариант, но хотя бы направление в какую сторону двигаться)
Что бы еще такого сделать, чтобы ничего не делать?

Последний раз редактировалось Stilet; 31.12.2013 в 09:15.
DpolenST вне форума Ответить с цитированием
Старый 30.12.2013, 23:18   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Оптимальный ответ даст только ПОЛНЫЙ перебор. При количестве предметов (очень примерно) больше 30 это уже не реально (банально время перебора превышает все мыслимые допустимые ожидания).
Но есть алгоритмы, которые достаточно быстро дают решение БЛИЗКОЕ к оптимальному.
Вот, сходите по ссылочке - ТЫРК
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.12.2013, 06:16   #6
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Оптимальный ответ даст только ПОЛНЫЙ перебор. При количестве предметов (очень примерно) больше 30 это уже не реально (банально время перебора превышает все мыслимые допустимые ожидания).
Но есть алгоритмы, которые достаточно быстро дают решение БЛИЗКОЕ к оптимальному.
Вот, сходите по ссылочке - ТЫРК
Навскидку, сколько моим способом будут обрабатываться 100 элементов?
Я так понимаю, этот алгоритм работает примерно так:
Вводим
4
2 1 19 18

Программа будет работать так:
Берутся 19 и 18
К 19 идёт 1 а к 18 идёт 2.
Разница между ними будет 0.
Это я понял, но как реализовать?
Результат нужен точный, а не приближённый.

Последний раз редактировалось Rhc; 31.12.2013 в 06:37.
Rhc вне форума Ответить с цитированием
Старый 31.12.2013, 08:40   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Результат нужен точный, а не приближённый
Про точный результат вам уже сказали - только полный перебор всех возможных вариантов разбивки. Всеми остальными способами этот наиболее оптимальный вариант можно получить только случайным образом
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 31.12.2013, 10:43   #8
Rhc
Новичок
Джуниор
 
Регистрация: 30.12.2013
Сообщений: 13
По умолчанию

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

Цитата:
По предложенной здесь идеи я сделал программу
Дык покажите её..
Poma][a вне форума Ответить с цитированием
Старый 31.12.2013, 11:13   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Хорошо, как будто выглядеть код для полного перебора?
Количество способов разбивки С(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 цифрами. Сколько лет потребуется компьютеру для расчета всех способов разбивки? (или вернее миллионов лет)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 31.12.2013 в 11:15.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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