Я бы разделил это на две задачи: а) найти все комбинации nCk вашего массива размера n b) найти все перестановки массива длины k. Вы сказали, что уже знаете, как выполнять перестановки, поэтому давайте сосредоточимся на комбинациях:
void combinations(int *arr, int *comb, int n, int k, int kCurr)
{
if(kCurr >= k)
{
permutations(comb, k);
return;
}
int i;
for(i=0; i<n; ++i)
{
comb[kCurr] = arr[i];
combinations(arr+i, comb, n-i, k, kCurr+1);
}
}
который будет называться так:
int myArray[49] = {1, 2, ..., 49};
int myCombs[5];
combinations(myArray, myCombs, 49, 5, 0);
Это вычисляет все комбинации 49C5 путем построения массива myCombs
, а когда он полон, вызывает функцию permutations
. Если permutations
реализован правильно, вы распечатаете все перестановки всех комбинаций 49C5.
РЕДАКТИРОВАТЬ: Duh, вы можете просто сделать combinations(arr, comb, n, k kCurr+1)
в качестве рекурсивного шага, а затем просто распечатать массив в базовом случае (или сделать что-нибудь).