Тема: алгоритм записи всех вариантов сочетаний в массив

Подскажите пожалуйста алгоритм записи в массив всех вариантов сочетаний n элементов по m.
Например есть одномерный массив:
a, b, с, d
Если брать по три элемента, то должно получиться 4 варианта
4!/(4-3)!*3!=4
Т.е. должен быть записан массив вида:
a, b, c
a, b, d
a, c, d
b, c, d

Re: алгоритм записи всех вариантов сочетаний в массив

Dim a(4) As Integer
a(0) = 1
a(1) = 2
a(2) = 3
a(3) = 4
a(4) = 5
'a(5) = 2
For i = 0 To 3
 For j = 0 To 3
  If i <> j Then Debug.Print a(j)
 Next
 Debug.Print "__"
Next

Вот простенький вариант

Re: алгоритм записи всех вариантов сочетаний в массив

Может я что-то не понимаю, но на входе имеем массив
1, 2, 3, 4, 5
и на выходе то-же самое

Re: алгоритм записи всех вариантов сочетаний в массив

Да я тут показал как собрать язык допустимых слов из алфавита, с условием, что позиция букы не встречается дважды в слове. И также предположил что Вам извесно, как заполняется массив.

Dim a() As Integer 'динамический массив
'ReDim [Preserve] varname(subscripts) [As type] [, varname(subscripts) [As type]] . . .
'Выделяем место для ПЯТИ элементов и очищаем
ReDim a(5)         'Изменяет размер динамического массива.
'оператор изменяет размер, но не очищает его
ReDim Preserve a(6)
'также обратите внимание на [b]UBound[/b] и [b]LBound[/b]

Re: алгоритм записи всех вариантов сочетаний в массив

https://www.caduser.ru/forum/topic6705.html

Re: алгоритм записи всех вариантов сочетаний в массив

Спасибо!
Правда мне нужен алгоритм не перестановок а сочетаний.
Нашел статью с кодом (наверное Паскаль), теперь надо перевести в VBA.
Рассмотрим задачу о генерации сочетаний в лексикографическом порядке.
Для примера рассмотрим начальные данные N=6 и M=4. Тогда число сочетаний равно 15.
Начальное сочетание образует последовательность 1, 2, .. m, а последнее n-m+1, … , n.
1234    1256    2345
1235    1345    2346
1236    1346    2356
1245    1356    2456
1246    1456    3456
Переход к следующему сочетанию осуществляется по следующему правилу. Требуется просмотреть текущее сочетание с конца и найти элемент, который можно увеличить. То есть такой элемент что a[i] < > n-k+i. Далее увеличиваем этот элемент на 1, а оставшуюся часть сочетания заполняем числами натурального ряда большими измененного элемента в порядке их следования.
Программа, реализующая генерацию сочетаний:
Program sochets;
var
   i,j,n,k: integer;
   a:array[0..100] of integer;    { массив для хранения сочетаний }
Procedure use;                { процедура вывода текущего сочетания }
var   i : integer;
begin
  writeln;
  for i:=1 to k do write(a[i]:3)
end;
Begin
  read(n,k);                { значения N и M }
  for i:=0 to k do a[i]:=i;        { формирование первого сочетания }
  repeat
     use;
     i:=k;
     while a[i]=n-k+i do dec(i);        { поиск элемента для изменения }
     inc(a[i]);
     for j:=i+1 to k do a[j]:=a[j-1]+1;  { изменение правой части сочетания }
  until i=0;
end.