Страницы: 1
RSS
Сочетания с повторами - подсчет количества и вывод вариантов, все сочетания до 4 элементов из 8 с повторами
 
Коллеги, день добрый.
Что-то затупил, не хватает знаний по математике и больше всего реально не хватает времени.

Есть некая система, собирающаяся из модулей. Модули бывают 8 типоразмеров. В систему могут быть объединены до 4 модулей (т.е. она может состоять из 1, 2, 3, 4 модулей, но не более 4 модулей). Система может состоять из любых (не обязательно разных) модулей.
Например: AA, AAB, G, CDEF, ABCDD, BBBB, DEEF, и так далее
Необходимо получить в табличку все сочетания различных типоразмеров с учетом указанных ограничений (количество модулей для каждой системы). Могу проставить руками, но на таком количестве строк боюсь промазать, а вопрос срочно-важный.

В общем, нид хелп :)
F1 творит чудеса
 
Лично я на вашем примере вообще ничего не понял. где там АА, ААВ, и т.д. где там модули и куда их надо сочетать?
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
CAHO, в файле верхняя строка - типоразмеры (мощности в данном случае). Их 8 столбцов. Ниже в столбцах поставлено количество модулей каждого типоразмера в системе (1 строка = 1 система). в первом столбце - суммарная мощность системы, в последнем - количество модулей в системе. Первый и последний столбцы - для меня, не обращайте внимания.
Нужны собственно все возможные варианты сочетаний красных цифр.
F1 творит чудеса
 
Добрый день, Максим!

Если я правильно понял условие - то это схожая задача с количеством пин-кодов (всего их возможно 10 000 - 10 цифр и четыре поля - 10 в 4 степени). В комбинаторике это размещения с повторениями. В вашей задаче получаем 8 в 4 степени, т.е. 4096 вариантов. Но, если система может быть составлена не только из 4, а еще из 3, 2 и 1 элементов, то всего вариантов получается - (8 в 4 степени + 8 в 3 степени + 8 во второй степени + 8 в первой степени) = 4096+512+64+8 = 4680 возможных вариантов. (основываясь, что Вы написали "AA, AAB, G, CDEF, ABCDD, BBBB, DEEF, и так далее").

К сожалению моих знаний хватает только на подсчет - встречал реализацию не размещений, а сочетаний (и без повторений) от MCH:
http://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=51941
 
Rickoshet, спасибо за совет!
Но в моем случае это именно сочетания с повторениями, для которых порядок не важен, и элемент k может браться несколько раз. если не ошибаюсь, количество сочетаний из n по k в этом случае подсчитывается как (n+k-1)!/(k!*(n-1)!)

В моем случае будет примерно так:
1 из 8 = 8
2 из 8 = 36
3 из 8 = 120
4 из 8 = 330
Итого: 494
Для 1 :) и 2, и 3 элементов проверил руками - сходится. А вот для 4 уже сложнее проверить, и там большой риск пропустить (пока для 3 делал - чуть на мыло не изошел).

Эх... придется наверное руками повозюкать еще 330 строк.
F1 творит чудеса
 
Ну тогда замечательно, что я ошибся - "повозюкать 330" не сравнить с "повозюкать 4680" :)
 
Код
Sub ABC_Combin()
    Dim a$(), i&, j&, k&, l&, m&, n&
    [a1].CurrentRegion.ClearContents
    n = Val(InputBox("n =", , 8)) 'количество различных букв
    m = Val(InputBox("m =", , 4)) 'максимальная выборка

    ReDim a$(l)
    For i = 1 To n
        For j = 0 To l
            For k = 1 To m - Len(a(j))
                l = l + 1
                ReDim Preserve a$(l)
                a(l) = a(j) & String$(k, 64 + i)
                Cells(l, 1) = a(l)
    Next k, j, i
End Sub
 
MCH, спасибо, завтра опробую!
ЗЫ: Что-то совсем зарыли в работу... форум забросил :(
F1 творит чудеса
 
MCH, все работает отлично!
не совсем тот формат, что мне нужен, ну тут я уж справлюсь.
Спасибо большое, выручили!
F1 творит чудеса
 
Цитата
Максим Зеленский написал: не совсем тот формат
Переделал вывод данных на "тот формат", сам алгоритм не менял
 
Цитата
Максим Зеленский написал: Необходимо получить в табличку все сочетания различных типоразмеров с учетом указанных ограничений
Кстати, а зачем нужны все сочетания? Нужно затем решать задачу по оптимизации с выбором наилучшего сочетания?
Страницы: 1
Наверх