Имя: Пароль:
1C
1С v8
Подбор суммы для числа
0 mataranga
 
02.09.14
09:13
Доброе время суток,

есть номенклатура A рублей

надо подобрать номенклатуру у которой сумма равна А рублей.

То есть

Шарик 1400 рублей

Одеяло 500 рублей + Кровать 400 рублей + Женщина 500 рублей = 1400 рублей

Количество номенклатуры неограниченно

Какие идеи?
1 butterbean
 
02.09.14
09:20
2 mataranga
 
02.09.14
10:31
&НаКлиенте
Процедура Команда1(Команда)
    МассивЦифр=Новый Массив();
    МассивЦифр.Добавить(11);//0
    МассивЦифр.Добавить(16);//1
    МассивЦифр.Добавить(8); //2
    МассивЦифр.Добавить(4); //3
    МассивЦифр.Добавить(7); //4
    МассивЦифр.Добавить(6); //5
    МассивЦифр.Добавить(3); //6
    МассивЦифр.Добавить(12);//7
    Итог=Команда1НаСервере(МассивЦифр,20,МассивЦифр);
    Для Каждого элемент из Итог Цикл
        Сообщить(элемент);
    КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Функция Команда1НаСервере(МассивЦифрИзменяемый,Сумма,МассивЦифр,Позиция=0)
    
    ИтоговыйМассив=Новый Массив;
    
    Если Сумма<=0 Тогда
        Возврат 0;
    КонецЕсли;
    
    Если МассивЦифрИзменяемый.Количество()=0 Тогда
        Возврат 0;
    КонецЕсли;
    
    ПервыйВМассиве=МассивЦифрИзменяемый[0];
    
    Если ПервыйВМассиве=Сумма Тогда
        ИтоговыйМассив.Добавить(МассивЦифр[Позиция]);
        Возврат ИтоговыйМассив;
    КонецЕсли;
    
    Если МассивЦифрИзменяемый.Количество()=1 Тогда
        Возврат 0;
    КонецЕсли;
    
    ВспомогательныйМассив=Новый Массив;
    МассивЦифрИзменяемый.Удалить(0);
    ВспомогательныйМассив = ЗначениеИзСтрокиВнутр(ЗначениеВСтрокуВнутр(МассивЦифрИзменяемый));
    
    РезВспомогательногоМассива=Команда1НаСервере(ВспомогательныйМассив,Сумма-ПервыйВМассиве,МассивЦифр, Позиция+1);
    
    Если РезВспомогательногоМассива<>0 Тогда
        РезВспомогательногоМассива.Добавить(МассивЦифр[Позиция]);
        Возврат РезВспомогательногоМассива;
    КонецЕсли;
    
    РезВспомогательногоМассива=Команда1НаСервере(ВспомогательныйМассив,Сумма,МассивЦифр,Позиция+1);
    
    Если РезВспомогательногоМассива<>0 Тогда
        Возврат РезВспомогательногоМассива;
    КонецЕсли;
    
    Возврат 0;
КонецФункции



В чем ошибка? Выводит 7 и 16
3 PR
 
02.09.14
10:33
(0) Поле чудес автоматизируешь?
4 mataranga
 
02.09.14
10:39
Если бы,

Мальчик говорит маме, дай 100 рублей на мороженку.
Мама дает, а мальчик говорит:
Давай скажем папе что ты мне дала на проезд в автобусе 25 руб., на тетрадки 50 рублей, и на ручки 25 рублей.
5 PR
 
02.09.14
10:40
(4) Что у вас, свежий завоз травы?
6 mataranga
 
02.09.14
10:41
(5) Зачем мне холодильник если я не курю
7 mikeone
 
02.09.14
11:02
(5) Вполне себе жизненная задача.
8 hhhh
 
02.09.14
11:46
а просто в пару циклов написать уже влом? Без этих дебильных рекурсий и значениевстроку и значениеиз строки?
9 torgm
 
02.09.14
11:55
(5) на заре 2000 регулярно появлялись такие задачи, как правило у компаний занимающихся, разницей и потом, + черные продажи в опте...

главбухи, с целью обеления продаж, чтобы не морочиться, просили провести продажу чего-нибудь через розницу по заниженной цене, на указанную сумму...

по факту разъяснения бухгалтерам, не совсем корректного под хода составляли совместно решение более красивое...
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой