Подскажите с перебором.

12
somefork
На сайте с 16.08.2008
Offline
99
682

Что-то зациклился на одной задаче.

Суть такова, что нужно найти количество перестановок из 40 чисел.

Может кто-нибудь подсказать, как это сделать? (Скорость работы скрипта не имеет значения)

Ремонтостан (http://remontostan.com)
Joker-jar
На сайте с 26.08.2010
Offline
171
#1

Количество? Факториал из 40? Это в виде числа нужно?

somefork
На сайте с 16.08.2008
Offline
99
#2

Забыл уточнить главное. Нужны наборы по 5 чисел.

Нужно не количество, а сам набор чисел. Грубо говоря список такого вида

1,2,3,4,5

1,2,3,4,6

.....

19,24,27,33,39

.....

AlikZP
На сайте с 22.11.2009
Offline
107
#3

С повторениями или без?

Website CMS: быстрая, удобная, недорогая! Вечная лицензия за 45$ (/ru/forum/524503) Яся - быстрый поиск фото для товаров. OpenCart/ocStore. Дополнение. (/ru/forum/665287) Грамотная верстка ваших макетов (/ru/forum/comment/8853216)
somefork
На сайте с 16.08.2008
Offline
99
#4

Была идея найти количество перестановок. Затем заносить в массив инкрементированное сорокоричное число вплоть до количества перестановок. Затем каждое буквенное представления числа заменить на число от 0 до 39, но функция base_convert в php ограничивает основание системы счисления до 36.

somefork добавил 29.08.2010 в 18:54

вообще нужно без повторений, но мне хотя бы с ними найти, а поторяшки я исключу.

Joker-jar
На сайте с 26.08.2010
Offline
171
#5

А, ну это тогда не перестановки, а сочетания :). На каком языке нужно?

somefork
На сайте с 16.08.2008
Offline
99
#6

нужно на php. Верно - это сочетания, а не перестановки.

AlikZP
На сайте с 22.11.2009
Offline
107
#7

Вот http://forum.pascal.net.ru/index.php?showtopic=3777&st=0&p=52823

на паскале, правда. Но он очень похож.

Joker-jar
На сайте с 26.08.2010
Offline
171
#8

Там простой рекурсивный алгоритм. Если до завтра никто не напишет, помогу. Просто у меня сейчас поздно очень, спать пора :)

somefork
На сайте с 16.08.2008
Offline
99
#9

Спасибо за советы. Пойду курить паскаль и переводить его в пых.

Joker-jar
На сайте с 26.08.2010
Offline
171
#10

Решил, все-таки накидать

<?php


$from = 1;
$to = 40;

function backtrace($last, $curcnt, $vals, $mask)
{
global $from, $to;
if ($curcnt >= 5)
{
// $vals - текущая найденная последовательность. делаем тут что-либо с ней, к примеру, я ее вывожу:
printf("(%d, %d, %d, %d, %d)<br />", $vals[0], $vals[1], $vals[2], $vals[3], $vals[4]);
return;
}
for ($i = $last+1; $i <= $to; $i++)
{
//if ($mask[$i]) continue;
$mask[$i] = true;
$vals[$curcnt] = $i;
backtrace($i, $curcnt+1, $vals, $mask);
$mask[$i] = false;
}
}

backtrace($from-1, 0, array(), array());
?>

Досканально не проверял, сплю :) Большой вывод в итоге получиться должен

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий