Нужен алгоритм набора нужной суммы #129178


#0 by iSeRG
Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую Пример: надо набрать 10 000 есть 20 000 Так вот алгорим должен взять 8 000+3 000 Господа, кто может поделитесь алгоритмом.
#1 by skunk
два по 5000... ближе
#2 by Парижская фанера
Не вижу большой разницы с распределением по фифо/лифо.
#3 by iSeRG
нет элемент берется один раз
#4 by iSeRG
ЛИФО и ФИФИ здесь не причем
#5 by Парижская фанера
Если так то сложнее... Это наверное уже ближе будет к задачи про "груз в рюкзаке" наверное...
#6 by Simod
Посмотри тут /  Может чего найдется.
#7 by Парижская фанера
Смысл тот же самый (в приближении конечно).
#8 by iSeRG
не так значит не так приближаешь
#9 by Широкий
Опа... задача на мини-макс
#10 by Парижская фанера
Да фиг ты так подберешь, и пример у тебя странный: Пример: надо набрать 10 000 есть 20 000 Так вот алгорим должен взять 8 000+3 000 > 10 000 А почему алгоритм не должен взять хотя бы 8000 + 2 * 1 000 = 10 000 ? При наличии 2 шт. по 1 000.
#11 by iSeRG
2 Парижская фанера, Широкий делаете вид что знаете :)
#12 by iSeRG
читай 3
#13 by Парижская фанера
Ну дак объясни толком, я не понимаю условий. ЗЫ Почему нельзя свести все к суммам (кол-во остатка * цену), а не ценам как у тебя и пройти по фифо?
#14 by Парижская фанера
Блин... Тогда удачи...
#15 by iSeRG
Нужен любой алгоритм кроме перебора
#16 by iSeRG
Похоже задача схожа с задачей про рюкзак, фанере спасибо
#17 by skunk
рекрусия...
#18 by iSeRG
любой не сложный
#19 by avb
Любой рабочий будет переборным и сложным ...
#20 by Волшебник
Что такое "рекрусия"?
#21 by skunk
не знаешь?
#22 by skunk
до завтра терпит... если да.. то жди... просто пять минут осталось... не успею...
#23 by iSeRG
терпит до 20.10.05
#24 by skunk
ну если до завтра не скажут... ченить выкину...
#25 by iSeRG
сенкс, интересно что ты там придумал, а то я тут уже про базис Грёбнера немного прочитал. Неохото так глубоко копать.
#26 by skunk
тебеже на одиСи надо... тогда просто через ТЗ...
#27 by Волшебник
неа
#28 by skunk
бывает...
#29 by iSeRG
Вот навоял вроде работает. Осталось=СуммаДоговора-СуммаВсего; ТаблицаСтоимости.ВыбратьСтроки; Не оптимально, зато есть решение (хотя его надо еще проверит)
#30 by м
Симплекс-метод тебе поможет
#31 by Волшебник
Может все-таки "рекурсия"?
#32 by Omega
а если у нас есть 7,5,4,2 и нужно набрать 13, то алгоритм должен взять 7,4 и 2, пропустив 5. правильно?
#33 by ДГоргон
легко, ща налабаю ...
#34 by iSeRG
точно
#35 by NS
Писать рюкзак 12 часов - это круто...
#36 by romix
1. Сортировка по убыванию 2. Брать самый верхний элемент, если он меньше оставшейся суммы. 3. Обнулить его в таблице, а оставшуюся сумму - уменьшить на это число. 4. goto 2, пока оставшаяся сумма >0
#37 by romix
Алгоритм имхо чисто итерационный, а не рекурсивный.
#38 by Парижская фанера
А подумать?
#39 by NS
(36,37) А если есть повторяющиеся числа, то перед этим их нужно сгруппировать (перед сортировкой), и брать в цикле от максимального количества до нуля. Писать проще на рекурсии, но быстрее работает на массиве (стеке). И цифири лучше перенести из ТЗ в Массив - раз в шесть быстрее будет.... И условия прерывания должны быть... Очень ускоряют... (если перебрали сумму, если на оставшихся уже не добрать до уже полученного значения и т.д.)
#40 by NS
А чё думать? В куче мест стоит и работает. Где-то в архивах realnet-а было - для Гены писал.
#41 by iSeRG
ну собственно в я так и делаю.
#42 by romix
(+36) Блин неверно... Сумма 10 000 по этому алгоритму будет списана как 15 000, а минимум - 11 000.
#43 by iSeRG
смотри как я сделал в случае если сумму не набрать меньшими суммами.
#44 by skunk
на короче... не знаю насколько оптимальный... но вроде шустрее твоего...
#45 by romix
щас проверил, в примере из списывает 15 000 вместо 11 000... Может действительно надо что-то вроде симплекс-метода (или чего-то там еще из исследования операций) юзать...
#46 by romix
Не осилил. Как его запустить-то...
#47 by NS
Еще раз - перебором нормально работает. Только писать нужно без ошибок.
#48 by skunk
ты думаешь я удивлен... что ты не осилил... ни капельке... поверь... off: Волшебнику... а что это за косяк с ["cb">]
#49 by skunk
+39 по ушустрению алгоритма... все числа которые больше суммы... можно удалить... короче думай сам...
#50 by NS
КонецПроцедуры Это для задачи "набрать максимальную сумму не большую данной" Без оптимизации по скорости, но с частичной оптимизацией по количеству итераций. По количеству итераций: 1. нет расчета начального значения для цикла. Оно должно быть равным не Кол, а мин(кол,цел(сумма/цена)) 2. нет группировки строк с одинаковой ценой 3. нет возврата при невозможности добрать нужную (уже найденную) сумму остальными товарами Для оптимизации по быстродействию - переделать ТЗ на массивы. Убрать рекурсивный вызов. (сделать стек на массиве) Убрать умножение (а*цена)
#51 by Simod
Вариант "тупого" перебора:
#52 by oPIRATor
не айда... набор сумм плавающий... массив юзать здесь низя...
#53 by NS
Ничего не понял... почему нельзя массив??? Задай сразу 100000 в размерность. Да и всех делов. Как я уже говорил - раз в шесть быстрее ТЗ...
#54 by Simod
Можно через СЗ или ТЗ, это непринциально. Просто работать будет подольше.
#55 by Simod
Проверял. Доходит до 9 раз...
#56 by oPIRATor
а вдруг получиться 100001 элементов надо...
#57 by NS
У тебя работает быстрее, чем ? строку лучше поменять... а=мин(ТЗ.ПолучитьЗначение(нач,"кол"),цел(сумма/ТЗ.ПолучитьЗначение(нач,"цена"))); и соответственно убрать условие на сумма<0...
#58 by NS
Тогда беда... Но не совсем ;-)) Можно юзать #ЗагрузитьИзФайла...
#59 by Simod
У тебя написано: "Это для задачи "набрать максимальную сумму не большую данной"". Я писал для : "Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую". Вообще-то не сравнивал :-)  Просто интересно было написать. Это с изменением *.txt и переоткрытием?
#60 by NS
То есть если сумма всех элементов больше нужной суммы - берем все элементы, ежели нет, то либо берем один минимальный, либо не берем вообще?
#61 by Simod
Как я понял автора нужно максимально приблизиться к искомой сумме, лучше с перебором, если невозможно, то с недобором.
#62 by iSeRG
правильно ;)
#63 by NS
Если сумма всех элементов больше необходимой суммы - то искать приближение сверху, иниче снизу? Это одна и та-же задача. Причем условие видимо формулировалось школьником. Чтоб найти приближение сверху - делаем СуммаКоторуюНадоНайти=Сумма(Цена*Количество)-СуммаКоторуюНадоНайти. Находим приблежение к новой сумме. И во всех строках меняем ВыбКол на (Кол-ВыбКол) (не лучший способ, но ничего страшного) А если сумма всех элементов меньше либо равна искомой сумме - то есно берем все элементы.
#64 by iSeRG
>> Это одна и та-же задача. Причем условие видимо формулировалось школьником. Чье условие !?
#65 by Simod
Если честно, то я твой алгоритм еще не разбирал  :-) Да и с рекурсией закручено...
#66 by NS
Условие в !!! см.
#67 by iSeRG
я совсем не школьник
#68 by iSeRG
и вообще я ее решил, см выше
#69 by NS
А отчего такая странная формулировка. В Даже не написано, чего надо минимизировать. И что значит условие "Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую" ??? Повторюсь дословно оно означает, что если сумма элементов меньше или равна искомой, то взять все. И что надо минимизировать? Дельту? - тогда (50+63) Если ничего - то по условию задачи - можно ВСЕГДА брать ВСЕ элементы.
#70 by NS
Как ты её решил - просто перебираем все элементы пока не достигли искомой суммы... (пока суммаТекущая<СуммаКоторуюНадоПолучить)... Ну никак не тянет на 69 постов в ветке...
#71 by iSeRG
согласен формулировка не четкая. Торопился.
#72 by iSeRG
не просто перебераем:
#73 by NS
Бред. В решается задача минимизации. Причем находит последовательно лучшие приближения - и всегда найдет наилучшее решение. (Хотя никто не мешает поставить ограничение на количество итераций)
#74 by iSeRG
объясни почему бред?
#76 by NS
Потому что это вариация
#77 by iSeRG
Итак : Основной цикл походу
#78 by NS
Да. Причем есно -если сумм только по одной, то он значительно проще.  КонецЕсли; Тестовый вариант  - значения 100000,10000,1000,100,10,1 набрать 100101... есно наберет.
#79 by NS
// и ТЗ конечно можно не передавать, и из всех вызовов убрать...
#80 by iSeRG
я так понимаю решением будут те строки у которых в колонке ВыбКол будут не нулевые  числа?
#81 by NS
Да, но алгоритм подбирает снизу, для подбора сверху -
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С