Добрый день, любители пошевелить извилинами!
Я к вам с интересной задачкой, которая возникла на работе, которую я, в принципе, решил, но всего лишь для большинства случаев, и все еще не получил научного оргазма, удовлетворения от элегантного ее решения) Задачка по алгоритмизации и связана с округлениями:
есть сумма С в рублях с точностью до коп., на которую надо поставить продукцию. Есть количество К кг продукции, которое надо поставить. Есть вес В одной штуки продукции.
Надо рассчитать цены за штуку и за килограмм с точностями до коп. Приэтом ЦенаЗаШт
ЦенаЗаКг / Вес. Можно раскидать несколькими строками с разными ценами, лишь бы все сошлось с точностью до копейки.
Например, сумма
206968,48 (руб.), колво
13003 (кг), вес одной штуки
0,65 (кг). Тогда цена за кг вроде бы
, но
, что в свою очередь категорически
! Решается эта проблема росписью двумя строками:
1) 5397,6 (кг) по цене 15,80 (что эквивалентно 8304 штуки по цене 10,27)
2) 7605,4 (кг) по цене 16,00 (что эквивалентно 11700,615 штук по цене 10,40)
В итоге
. Круто!
Мой алгоритм росписи двумя строками:
1) сначала создадим табличку ЦенаЗаШт - ЦенаЗаКг, в которую вобьем значения цен, которые при конвертации из штук в кг и обратно дают цены с точностью до 2 знака (до коп.). Отсортируем эту табличку так, чтоб первая цена была наиболее близко к "справедливой".
2)
Код:
Цикл по ценам из таблички
Цикл от i = 1 По К
Колво1 = i;
Колво2 = К - i;
//Далее расчеты цен, проверки, что окргуленные до коп. суммы совпадают
Пользователю нужно вывести все найденные варианты. Я здесь отбросил нюансы и те оптимизации, которые я сделал, чтобы не засорять итак большую "простыню".
Код работает, все хорошо, но не всегда. Тогда приходиться расписывать тремя строчками, и без оптимизации это может занять день на вполне хороших компах (перебор примерно
вариантов).
Я оптимизировал и это, в основном за счет того, что сузил интервалы поиска решений. Но алгоритм не справился с задачкой, когда отгрузка на 1,5 миллиона - 70 тонн.
И вот я ищу элегантное и быстрое решение. Кроме перебора, который, как сказано выше, при серьезных значениях может идти сутки, если не больше.
Первая идея - решать получающееся нелинейное неравенство для значительного сужения интервалов поиска решений. Но как-то даже не знаю..
В интернете не могу найти какой-либо стоящей информации, по-видимому, эта область математики (связанная с окргулениями и подбором сумм) вообще не исследуется на серьезном уровне.
Может кто-нибудь что-нибудь подскажет? Задачка сложная, но жутко интересная для меня на моей работе)