![]() | [1] [2] |
(39) и как понимать эти ряды цифр? |
41-bma1 > Видимо кто-то из вас что-то отбросил:) ИМХО, надо представить как действует мозг человека при ручном подборе. наверно надо сначала отбросить младшие разряды и подобрать оптимальный вариант по старшим с некоторым запасом на "хвосты". Потом добивать остаток возможными для выбранных старших разрядов хвостами. если не хватает или сильное превышение - искать соседний по старшим... |
Исключил повторения. 14:00:54 +617+615+615+615+615+615+614+613+613+613+612+411+276+56 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-323+128-332+128-338+128-327 +617+615+615+615+615+615+614+613+613+613+611+411+125+117+63+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-326+128-332+128-320+128-322+128-321+128-337 +617+615+615+615+615+615+614+613+613+613+610+411+276+30+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-340+128-332+128-338+128-333+128-337 +617+615+615+615+615+615+614+613+613+613+610+411+276+30+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-318+128-332+128-338+128-333+128-337 +617+615+615+615+615+615+614+613+613+613+609+411+125+117+63+30 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-330+128-332+128-320+128-322+128-321+128-333 +617+615+615+615+615+615+614+613+613+613+554+411+276+56+30+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-328+128-332+128-338+128-327+128-333+128-337 +617+615+615+615+615+615+614+613+613+613+612+350+309+56+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-323+128-343+128-339+128-327+128-337 +617+615+615+615+615+615+614+613+613+613+612+309+261+117+56 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-323+128-339+128-342+128-322+128-327 +617+615+615+615+615+615+614+613+613+613+612+411+125+116+63+28 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-323+128-332+128-320+128-331+128-321+128-337 +617+615+615+615+615+615+614+613+613+613+612+350+276+117 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-323+128-343+128-338+128-322 +617+615+615+615+615+615+614+613+613+613+611+350+309+55+30 +128-341+128-336+128-317+128-334+128-329+128-325+128-324+128-335+128-315+128-316+128-326+128-343+128-339+128-319+128-333 14:01:52 |
41 - эти наборы чисел такие 1 строка - метры из твоего примера 2 строка - номера бухт " Как типичный пример: (первое значение - номер бухты, второе длина в метрах, сантиметры откидываем сразу)" |
И тут идёт проверка на точное совпадение. Под +-% надо условия дописывать. |
Так что, 7500 за 1 минуту все варианты, интересует? Или что-то лучше есть? |
2(44) понятно, буду пробовать 2(42) Понятия не имею как работает мозг ("Голова - предмет тёмный и исследованию не подлежит..." к/ф "Формула любви"). Скажу как подбирал я: сперва бессисетмный набор бухт методом тыка. Потом смотрю на получившийся результат (насколько недостает или превышает), потом на оставшиеся невыбранные позиции и через пару минут упорного гипнотизирования списка вижу кого на что менять надо (каких либо осознанных переборов вариантов не произвожу). |
Сейчас переписал на массивы(было сначала через таблицу значений сделано) - ищет примерно 8-10 секунд. |
Перем Тз[100],Флаги[100],Спр[100],Список,ТзКоличествоСтрок; Процедура Показать() Стр=""; Стр1=""; Стр2=""; К1=0; Для К=1 По ТзКоличествоСтрок Цикл Стр2=Стр2+Флаги[К]; Если Флаги[К]=1 Тогда Если Стр="" Тогда Стр=Стр+Тз[К]; Стр1=Стр1+Спр[К]; Иначе Стр=Стр+"+"+Тз[К]; Стр1=Стр1+"+"+Спр[К]; КонецЕсли; К1=К1+Тз[К]; КонецЕсли; КонецЦикла; Если Список.НайтиЗначение(Стр2)=0 Тогда Сообщить(Стр+"="+К1); Сообщить(Стр1); Список.ДобавитьЗначение(Стр2) КонецЕсли; КонецПроцедуры Процедура НайтиЧисла(Остаток) Перем СтарыйОстаток; Если Остаток<=0 Тогда Возврат КонецЕсли; Для К=1 По ТзКоличествоСтрок Цикл Если Флаги[К]=1 Тогда Продолжить КонецЕсли; Если Тз[К]>Остаток Тогда Продолжить КонецЕсли; Флаги[К]=1; СтарыйОстаток=Остаток; Остаток=Остаток-Тз[К]; НайтиЧисла(Остаток); Если Остаток<=0 Тогда Возврат КонецЕсли; Флаги[К]=0; Остаток=СтарыйОстаток; КонецЦикла; КонецПроцедуры Процедура Сформировать() Список=СоздатьОбъект("СписокЗначений"); Текст=СоздатьОбъект("Текст"); Текст.Открыть("c:\ccc.txt"); ТзКоличествоСтрок=Текст.КоличествоСтрок(); Тз1=СоздатьОбъект("ТаблицаЗначений"); Тз1.НоваяКолонка("К","Число"); Тз1.НоваяКолонка("Номер","Строка"); Для К=1 По ТзКоличествоСтрок Цикл Тз1.НоваяСтрока(); Стр=Текст.ПолучитьСтроку(К); К1=Найти(Стр," "); Тз1.К=Число(Сред(Стр,К1+1)); Тз1.Номер=Лев(Стр,К1-1); КонецЦикла; Тз1.Сортировать("К-"); Для К=1 По ТзКоличествоСтрок Цикл Тз1.ПолучитьСтрокуПоНомеру(К); Тз[К]=Тз1.К; Спр[К]=Тз1.Номер; Флаги[К]=0; КонецЦикла; Сообщить(ТекущееВремя()); Остаток=Сумма; Для К=1 По ТзКоличествоСтрок Цикл Если Тз[К]>Остаток Тогда Продолжить КонецЕсли; Флаги[К]=1; Остаток=Остаток-Тз[К]; НайтиЧисла(Остаток); Если Остаток=0 Тогда Показать() КонецЕсли; Для К1=1 По ТзКоличествоСтрок Цикл Флаги[К1]=0; КонецЦикла; Остаток=Сумма; КонецЦикла; // Сообщить(ТекущееВремя()); КонецПроцедуры В текстовом файле пример, приведённый выше. |
Это не полный перебор. Как частный случай тебе должно хватить для твоей задачи. |
Текущее время: 09:27. Часовой пояс GMT +3. | [1] [2] |