Имя: Пароль:
IT
 
Перебор цифр в массиве
,
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