Как перебрать все варианты чего-либо
Навеяно темой с Мисты:
Имеем ряд чисел от одного до девяти, надо расставить знаки плюсы и минусы, чтобы получилось в сумме 20
1(+/-)2(+/-)3(+/-)4(+/-)5(+/-)6(+/-)7(+/-)8(+/-)9 = 20 (20 не получиться, это просто пример!!!)
Вот как можно автоматизировать пример, что бы получить все варианты расчета?
- Описание
- Подробнее
Описание
Я раньше занимался программированием на Ассемблере, так что для меня двоичная и шестнадцатиричная система счисления ближе десятичной.
1 = 1000, 2 = 0100, 3 = 1100, 4 = 0010 и т.д. из этого для примера возьмем 0 = Минус, 1 = Плюс
В выше указаном примере нам надо перебрать 8 различных подстановок +- (8 = 11111111B = 255D)
КоличествоВариантов = 8;
КоличествоВариантовРасчета = POW(2, КоличествоВариантов) — 1; //Расчитываем количество вариантов
Для ВариантРасчета = 0 По КоличествоВариантовРасчета Цикл //Перебираем варианты
ЗначениеВариантаРасчета = ВариантРасчета; //Берем текущий вариант
Пример = «»; //Текст примера
Для ПереборВарианта = 1 По КоличествоВариантов Цикл //Перебираем расчет варианта
Вариант = ЗначениеВариантаРасчета%2; // Получаем значение варианта
//Здесь выполняем действие со значением варианта, в нашем примере знак «+» или «-«
Знак = ?(Вариант = 1, «+», «-«);
//Делаем текст примера
Пример = Пример + ПереборВарианта + Знак;
//***
ЗначениеВариантаРасчета = Цел(ЗначениеВариантаРасчета / 2); //Сдвигаем на следующее значение варианта
КонецЦикла;
Пример = Пример + «9»;//т.к. последнее число не вошло в цикл просто добавим его.
РасчетПримера = Вычислить(Пример);//Вычислим выражение
Сообщить(Пример + » = » + РасчетПримера);
КонецЦикла;
По этому принципу расчета сделана моя обработка «Рюкзак».

