@MasterCopipaster

Составить алгоритм перебора вариантов с весом?

Подскажите чет туплю не знаю как сделать, есть такой массив.
<?php
$a = [
    0 => 'a',
    1 => 'b',
    2 => 'c'
];

Мне надо перебрать все возможные варианты, но с сохранением веса, в качестве веса индекс массива.
Сейчас объясню подробнее: тоесть элемент с индексом 0 не может идти за индексом 1 а индекс 1 не может быть перед нулем.
Для текущего массива получатся такие варианты:
a
b
c
ab
ac
bc
abc

Обратите внимание что не могут получится варианты типа acb потому что индекс b меньше индекса с
Надеюсь понятно объяснил, алгоритм перебора всех возможных вариантов тут не подходит. А мне чет в голову не приходит как это написать адекватно.
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
@dimoff66
Кратко о себе: Я есть
Если перестановки не нужны, то все просто. Каждый элемент либо входит в следующий вариант, либо нет. Соответственно делаете цикл 1 до pow(2, count($arr)). Преобразовываете каждое число цикла в двоичное встроенной функцией decbin, переворачиваете результат, и по нему составляете новый вариант - если 1 на соответствующем месте возвращенной decbin строки, то включаете элемент, если 0, то исключаете.

$arr = [0 => 'a', 1 => 'b', 2 => 'c'];
$res = [];

for ($i = 1; $i < pow(2, count($arr)); $i++ ) {
    $bin = decbin($i);
    $case = "";
    foreach(str_split(strrev($bin)) as $ind => $symb) if ($symb == "1") $case .= $arr[$ind];
    $res[] = $case;
}

echo implode(", ", $res); // a, b, ab, c, ac, bc, abc
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы