Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
9:05:2008, 08:47
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 9:05:2008 Пользователь №: 17 149 Репутация: 0
|
Добрый день Уважаемые программисты!
Мне тут поставили вроде бы лёгкую задачу, которую я никак не могу решить. Соль в следующем: дана матрица А:6 на 3: 6 5 6 5 4 7 7 6 9 6 5 10 8 4 8 3 8 12 Нужно найти такую матрицу Х, состоящую из нулей и единиц(причём в каждом столбце может быть только одна единица) при которой сумма произведений элементов матриц(А*Х) будет минимальной. Рекомендовали перебор, я просмотрел наверно уже все алгоритмы, но так и не понял как тут применить. Помогите, Пожалуйста, заранее благодарен. Ответ: я забыл про одно условие: что сумма по строкам должна быть два То есть, ответ здесь такой: 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 Чтобы при умножений элементов такой матрицы(массива) на исходную 0 0 6 0 0 7 7 0 0 0 5 0 0 4 0 3 0 0 и минимум будет: 7+4+6+3+5+7=32 Решить не проблема, но как реализовать в делфи я не знаю Сообщение отредактировал pikkk - 9:05:2008, 11:12 |
|
Сообщение
#1
|
|
![]() |
|
|
9:05:2008, 11:47
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 100 Регистрация: 27:02:2004 Пользователь №: 296 Репутация: 5
|
Если в одном столбце может быть ровно одна единица, то для трёх строк и шести столбцов всего будет 3^6=729 вариантов.
Матрицу с единицами для экономии памяти можно представить в виде массива длиной 6, в ячейках которого будет номер строки, в которой должна быть единица, т.е. для 0 0 1 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 это будет (если индексация начинается с 1) 2 3 1 3 2 1 Таким образом, задача сведётся к перебору номеров а-ля 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 3 1 1 1 1 2 1 1 1 1 1 2 2 1 1 1 1 2 3 ..... 3 3 3 3 3 3 Условие "сумма по строкам=2" можно учесть, проверяя, чтобы в текущем варианте каждый номер встречался ровно два раза, т.е. вышеприведённое сведётся к чему-то типа 1 1 2 2 3 3 1 2 2 3 3 1 2 2 3 3 1 1 1 3 2 3 2 1 и т.п. Для каждого варианта нужно хранить сумму соответствующих элементов матрицы A (да-да, умножение не нужно). После полного перебора будет достаточно найти минимальную сумму и соответствующий ей вариант. |
|
Сообщение
#2
|
|
|
|
9:05:2008, 13:01
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 9:05:2008 Пользователь №: 17 149 Репутация: 0
|
Хм.. алгоритм понятен, вот тока как это в Делфи реализовать, еще чтобы на каждой перестановке он сумму записывал...
|
|
Сообщение
#3
|
|
|
|
10:05:2008, 23:04
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 100 Регистрация: 27:02:2004 Пользователь №: 296 Репутация: 5
|
pikkk, я бы сделал динамический массив record'ов {массив, сумма}. Хотя даже нет, все варианты хранить совершенно не нужно, достаточно хранить самый лучший и текущий.
Но если вопрос не в алгоритме, а в языке -- то, видимо, стоит почитать букварь по Delphi. |
|
Сообщение
#4
|
|
|
|
12:05:2008, 15:08
|
|
Новенький ![]() Группа: Программист Сообщений: 3 Регистрация: 9:05:2008 Пользователь №: 17 149 Репутация: 0
|
Спасибо за алгоритм, я всё реализлвал
ПС: не нашёл где плюсик ставить |
|
Сообщение
#5
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 03:59 |