Розбиття на доданки#2390

Розбиття на доданки (Розбір)

Нехай n = x_1 + x_2 + ... + x_k — розбиття числа на натуральні доданки. Згідно з умовою задачі, доданки будь-якого розбиття мають задовольняти нерівність:

x_1 \ge x_2 \ge ... \ge x_k

Перше доданок x_1 може приймати значення від до , а кожне наступне x_i~(2 \le i \le k) — значення від до x_{i-1}.

Рекурсивна суть процедури генерації розбиттів полягає в наступному: якщо при розбитті числа в якості першого доданка обрано x_1~(x_1 \le n), то далі слід згенерувати всі можливі розбиття числа n - x_1 на доданки, що не перевищують x_1.

Реалізація алгоритму

У масиві будемо генерувати розбиття числа .

int x[50];

Функція f генерує розбиття числа і має три аргументи:

void f(int pos, int max, int n)
{

Якщо значення стало рівним нулю, це означає, що розбиття завершено, і поточний вміст масиву представляє чергове розбиття. У цьому випадку виводимо масив.

  if (n == 0)
  {
    for (int i = 0; i < pos; i++) 
      printf("%d ", x[i]);
    printf("\n");
    return;
  }

У позиції масиву може знаходитися будь-яке число від до min(max, n).

  for (int i = 1; i <= min(max, n); i++)
  {
    x[pos] = i;
    f(pos + 1, i, n - i);
  }
}

Основна частина програми. Читаємо вхідне значення та запускаємо функцію генерації всіх можливих розбиттів цього числа.

scanf("%d",&n);
f(0,n,n);