Имя: Пароль:
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 регулярно появлялись такие задачи, как правило у компаний занимающихся, разницей и потом, + черные продажи в опте...

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

по факту разъяснения бухгалтерам, не совсем корректного под хода составляли совместно решение более красивое...
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn