Нехай n = x_1 + x_2 + ... + 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);