#0
by iSeRG
Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую Пример: надо набрать 10 000 есть 20 000 Так вот алгорим должен взять 8 000+3 000 Господа, кто может поделитесь алгоритмом.
#5
by Парижская фанера
Если так то сложнее... Это наверное уже ближе будет к задачи про "груз в рюкзаке" наверное...
#10
by Парижская фанера
Да фиг ты так подберешь, и пример у тебя странный: Пример: надо набрать 10 000 есть 20 000 Так вот алгорим должен взять 8 000+3 000 > 10 000 А почему алгоритм не должен взять хотя бы 8000 + 2 * 1 000 = 10 000 ? При наличии 2 шт. по 1 000.
#13
by Парижская фанера
Ну дак объясни толком, я не понимаю условий. ЗЫ Почему нельзя свести все к суммам (кол-во остатка * цену), а не ценам как у тебя и пройти по фифо?
#25
by iSeRG
сенкс, интересно что ты там придумал, а то я тут уже про базис Грёбнера немного прочитал. Неохото так глубоко копать.
#29
by iSeRG
Вот навоял вроде работает. Осталось=СуммаДоговора-СуммаВсего; ТаблицаСтоимости.ВыбратьСтроки; Не оптимально, зато есть решение (хотя его надо еще проверит)
#32
by Omega
а если у нас есть 7,5,4,2 и нужно набрать 13, то алгоритм должен взять 7,4 и 2, пропустив 5. правильно?
#36
by romix
1. Сортировка по убыванию 2. Брать самый верхний элемент, если он меньше оставшейся суммы. 3. Обнулить его в таблице, а оставшуюся сумму - уменьшить на это число. 4. goto 2, пока оставшаяся сумма >0
#39
by NS
(36,37) А если есть повторяющиеся числа, то перед этим их нужно сгруппировать (перед сортировкой), и брать в цикле от максимального количества до нуля. Писать проще на рекурсии, но быстрее работает на массиве (стеке). И цифири лучше перенести из ТЗ в Массив - раз в шесть быстрее будет.... И условия прерывания должны быть... Очень ускоряют... (если перебрали сумму, если на оставшихся уже не добрать до уже полученного значения и т.д.)
#40
by NS
А чё думать? В куче мест стоит и работает. Где-то в архивах realnet-а было - для Гены писал.
#42
by romix
(+36) Блин неверно... Сумма 10 000 по этому алгоритму будет списана как 15 000, а минимум - 11 000.
#45
by romix
щас проверил, в примере из списывает 15 000 вместо 11 000... Может действительно надо что-то вроде симплекс-метода (или чего-то там еще из исследования операций) юзать...
#48
by skunk
ты думаешь я удивлен... что ты не осилил... ни капельке... поверь... off: Волшебнику... а что это за косяк с ["cb">]
#49
by skunk
+39 по ушустрению алгоритма... все числа которые больше суммы... можно удалить... короче думай сам...
#50
by NS
КонецПроцедуры Это для задачи "набрать максимальную сумму не большую данной" Без оптимизации по скорости, но с частичной оптимизацией по количеству итераций. По количеству итераций: 1. нет расчета начального значения для цикла. Оно должно быть равным не Кол, а мин(кол,цел(сумма/цена)) 2. нет группировки строк с одинаковой ценой 3. нет возврата при невозможности добрать нужную (уже найденную) сумму остальными товарами Для оптимизации по быстродействию - переделать ТЗ на массивы. Убрать рекурсивный вызов. (сделать стек на массиве) Убрать умножение (а*цена)
#53
by NS
Ничего не понял... почему нельзя массив??? Задай сразу 100000 в размерность. Да и всех делов. Как я уже говорил - раз в шесть быстрее ТЗ...
#57
by NS
У тебя работает быстрее, чем ? строку лучше поменять... а=мин(ТЗ.ПолучитьЗначение(нач,"кол"),цел(сумма/ТЗ.ПолучитьЗначение(нач,"цена"))); и соответственно убрать условие на сумма<0...
#59
by Simod
У тебя написано: "Это для задачи "набрать максимальную сумму не большую данной"". Я писал для : "Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую". Вообще-то не сравнивал :-) Просто интересно было написать. Это с изменением *.txt и переоткрытием?
#60
by NS
То есть если сумма всех элементов больше нужной суммы - берем все элементы, ежели нет, то либо берем один минимальный, либо не берем вообще?
#61
by Simod
Как я понял автора нужно максимально приблизиться к искомой сумме, лучше с перебором, если невозможно, то с недобором.
#63
by NS
Если сумма всех элементов больше необходимой суммы - то искать приближение сверху, иниче снизу? Это одна и та-же задача. Причем условие видимо формулировалось школьником. Чтоб найти приближение сверху - делаем СуммаКоторуюНадоНайти=Сумма(Цена*Количество)-СуммаКоторуюНадоНайти. Находим приблежение к новой сумме. И во всех строках меняем ВыбКол на (Кол-ВыбКол) (не лучший способ, но ничего страшного) А если сумма всех элементов меньше либо равна искомой сумме - то есно берем все элементы.
#64
by iSeRG
>> Это одна и та-же задача. Причем условие видимо формулировалось школьником. Чье условие !?
#69
by NS
А отчего такая странная формулировка. В Даже не написано, чего надо минимизировать. И что значит условие "Есть задача набрать на не меньшую сумму элементов с определенной ценой, а если это не возможно то на меньшую" ??? Повторюсь дословно оно означает, что если сумма элементов меньше или равна искомой, то взять все. И что надо минимизировать? Дельту? - тогда (50+63) Если ничего - то по условию задачи - можно ВСЕГДА брать ВСЕ элементы.
#70
by NS
Как ты её решил - просто перебираем все элементы пока не достигли искомой суммы... (пока суммаТекущая<СуммаКоторуюНадоПолучить)... Ну никак не тянет на 69 постов в ветке...
#73
by NS
Бред. В решается задача минимизации. Причем находит последовательно лучшие приближения - и всегда найдет наилучшее решение. (Хотя никто не мешает поставить ограничение на количество итераций)
#78
by NS
Да. Причем есно -если сумм только по одной, то он значительно проще. КонецЕсли; Тестовый вариант - значения 100000,10000,1000,100,10,1 набрать 100101... есно наберет.
#80
by iSeRG
я так понимаю решением будут те строки у которых в колонке ВыбКол будут не нулевые числа?
Тэги: Математика и алгоритмы
Ответить:
Комментарии доступны только авторизированным пользователям
В этой группе 1С
- ЗиК: Форма Т-54
- А как программно узнать есть ли в документе Идентификатор "Контрагент"?
- Как программно очистить табло?
- Справочник -> Форма списка -> запрет на редактирование
- Как получить GUID базы данных 1С?
- изменить период расчёта заработной платы
- Сравнение 2 таблиц значений?
- Как быстро сформировать из ADO SQL -> ТЗ
- v7. ЗиК.... Как должно начислять пособие на ребенка до 1,5 и 3 лет?
- аналог в запросе РегистрСведений..ПолучитьПоследнее()
- Как получить объект метаданных, зная его "Тип"?
- В гонке DARPA робокары дошли до финиша
- Как проставить параметр standalone="yes" XML формир. из 1С
- 1С 8.0 Можно ли в отладке посмотреть таблицу значений
- Неизвестный формат сжатия
- В условие запроса можно список значений?
- Создание поля типа Дата в DBF
- Ортикон: 1С:Предприятие 8.0 Управление страховой компанией
- _getPerformanceCounter() Простите, это что такое?
- Обвести рамкой ячейки в Excel.Как сделать?