|
Перебор цифр в массиве | ☑ | ||
---|---|---|---|---|
0
Nikoss
16.01.13
✎
15:01
|
В общем есть произвольной длины массив содержащий только 0 и 1.
к примеру: 0001001101101 мне нужно перебрать все возможные варианты расстановки 0 и единиц, кол-во единиц задается... подскажите... :( |
|||
1
НафНаф
16.01.13
✎
15:02
|
контрольная?
|
|||
2
НафНаф
16.01.13
✎
15:02
|
если длина реально произвольная, то вариантов бесконечно
|
|||
3
Nikoss
16.01.13
✎
15:04
|
да нет, в том то и прикол, что школу и университет давно окончил%) "произвольная" имеется в виду - указывается...
т.е. длина к примеру 22, кол-во единиц 5 |
|||
4
NS
16.01.13
✎
15:04
|
Нужен перебор, или нужно рассчитать количество комбинаций?
|
|||
5
Nikoss
16.01.13
✎
15:05
|
именно перебор, кол-во комбинаций не проблема посчитать
|
|||
6
drcrasher
16.01.13
✎
15:09
|
банально:
- строка 0000 (заданная длина) - если кол-во 1 фиксированно (т.е. строго n "1", а на от 0 до n), то подстановкой 00001111. Дальше перебор в виде 00010111, 00011011, 00011101... - если не фиксировано, то см выше, но с учетом ввода новых 1-чек позиции хранить в массиве, например. |
|||
7
NS
16.01.13
✎
15:10
|
Процедура перебор_рек(стр,колед,длин)
Если длин=0 Тогда сообщить(стр); возврат; КонецЕсли; Для а=?(колед=длин,1,0) по ?(колед=0,0,1) Цикл перебор_рек(стр+а,колед-а,длин-1); КонецЦикла; КонецПроцедуры Процедура Перебор(количество_единиц,Длина_числа); Перебор_рек("",количество_единиц,Длина_числа); КонецПроцедуры Процедура Сформировать() Перебор(2,5); КонецПроцедуры |
|||
8
1Сергей
16.01.13
✎
15:22
|
(7) ниасилел
|
|||
9
DimGan
16.01.13
✎
15:24
|
)))
п1 расчитываем количество комбинаций п2 смотрим какое число в 10ричной сист принадлежит всем нулям п3 смотрим какое число принадлежит всем еденицам п4 перебираем десятичные числа от первой до последней переводя каждый раз в двоичную систему. |
|||
10
NS
16.01.13
✎
15:25
|
Элементарный код. Если количество отавшихся единиц равно нулю, то цикл с нуля до нуля, если число оставшихся единиц равно числу оставшихся цифр - то цикл с единицы до единицы. Иначе цикл от 0 до 1. Для каждого знака.
|
|||
11
1Сергей
16.01.13
✎
15:28
|
(10) а... умно
|
|||
12
Nikoss
16.01.13
✎
15:37
|
(7) спасибо.
только на 30/6 уже загнулся можно как то, чтобы примерно 50/10 осилил в минут 10? или это самый оптимальный вариант? |
|||
13
NS
16.01.13
✎
15:42
|
(12) Загибается на выводе?
Я не смогу уменьшить количество возможных перестановок :) |
|||
14
1Сергей
16.01.13
✎
15:44
|
видимо, быстрее будет, если делать не на 1С
|
|||
15
acsent
16.01.13
✎
15:46
|
50/10 - это сколько перестановок?
|
|||
16
NS
16.01.13
✎
15:53
|
(14) Быстрее что? Перебор на порядки быстрее вывода на экран.
И обработать квадрилионы сочетаний естественно не получится ни на каком компе, и бстродействие не поможет. (15) Много. Не сосчитает. Солнце помешает - землю поглатит через несколько миллиардов лет. |
|||
17
Nikoss
16.01.13
✎
15:55
|
10 272 278 170
всего та (16) да вывод отключал конечно |
|||
18
NS
16.01.13
✎
15:57
|
(17) Вроде ты неправильно сосчитал.
|
|||
19
NS
16.01.13
✎
15:58
|
50!/40!/10!
|
|||
20
NS
16.01.13
✎
15:59
|
Нет, всё верно. Но всё-равно многовато.
Сейчас ускорю. |
|||
21
NS
16.01.13
✎
16:00
|
Хотя некуда ускорять :(
|
|||
22
SUA
16.01.13
✎
16:00
|
10^9 считает за разумное время, здесь 10^10
с полчаса-2часа думать будет |
|||
23
1Сергей
16.01.13
✎
16:01
|
50/* = 1 125 899 906 842 624 вариантов
|
|||
24
acsent
16.01.13
✎
16:03
|
можно без рекурсии обойтись
http://symmetrica.net/algorithms/combinations.htm |
|||
25
NS
16.01.13
✎
16:04
|
(24) Конечно можно. Только быстрее не будет. Основное время потратится на обработку набора, а не на перебор.
|
|||
26
NS
16.01.13
✎
16:05
|
Любая рекурсия заменяется стеком.
|
|||
27
acsent
16.01.13
✎
16:05
|
(25) набор не хранить в памяти писать последовательно в текст
|
|||
28
NS
16.01.13
✎
16:07
|
(27) Ничего не понял.
|
|||
29
acsent
16.01.13
✎
16:11
|
(28) тогда поясни что ты имел ввиду под обработкой набора?
|
|||
30
NS
16.01.13
✎
16:17
|
(29) Ему не просто нужно перебрать все перестановки,
а что-то с ними нужно сделать. Каждую с чем-то сравнить. Перестановки у меня не сохраняются в памяти и так. А просто перебор их последовательно получает. |
|||
31
Nikoss
17.01.13
✎
10:00
|
Вообще задача состоит в следующем:
Есть, грубо, таблица: Номенклатура, Сумма. Указывается НеобходимаяСумма и КолвоПозиций. Нужно найти такие варианты позиций из таблицы, чтобы сумма этих позиций была равна НужнойСумме, а колво позиций, соответственной, КОлвоПозиций. Перебор, который я спрашивал ранее, по сути перебор индексов, которые нужно просуммировать. По вычисленному варианту я суммирую позиции и сравниваю с НеобходимойСуммой. Но, есть таблицы, где и по ~40 позиций есть, а с такими уже загибается. Может я не верный подход выбрал? Пример: Таблица: карандаш 10 ручка 20 ластик 30 чернила 40 степлер 20 НеобходимаяСумма 60, КолвоПозиций 3. Ответ: Карандаш, Ластик, Степлер Карандаш, Ручка, Ластик Если, например, КолвоПозиций будет 2, то ответ: Ручка, Чернила Чернила, Степлер |
|||
32
NS
17.01.13
✎
10:53
|
(31) Задача называется - Задача о рюкзаке.
Метод решения ты естественно выбрал неверный. |
|||
33
Nikoss
17.01.13
✎
11:17
|
(32), вот блин...
сейчас буду гуглить |
|||
34
NS
17.01.13
✎
12:15
|
Самый простой метод решения - направильный перебор с отсечениями.
|
|||
35
NS
17.01.13
✎
12:18
|
Можно решить симлекс-методом.
|
|||
36
Simod
17.01.13
✎
12:28
|
Кароче, было уже: Нужен алгоритм набора нужной суммы
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |