Аналіз алгоритму
Нехай дорівнює найменшій кількості одиниць, за допомогою яких можна скласти число . Очевидно, що .
Число 2 можна представити тільки як суму двох одиниць: . Тому . Число 3 можна представити тільки як суму трьох одиниць: . Тому .
Число 4 представимо або у вигляді , або . Однак у обох випадках використовується 4 одиниці. Отже .
Розглянемо шукане вираз, результат якого дорівнює .
Нехай останньою виконаною в ньому операцією було додавання. Нехай, наприклад, перше доданок складається з одиниць, а друге доданок складається з одиниць. Значення слід вибрати таким, щоб сума була мінімальною.
При цьому значення достатньо перебирати до , оскільки можна припустити, що перше доданок не більше другого. Таким чином, має місце співвідношення:
Нехай останньою виконаною в ньому операцією було множення. Нехай, наприклад, перший множник складається з одиниць, а другий множник складається з одиниць. Цей випадок має місце, якщо ділиться націло на .
Значення слід вибрати таким, щоб сума була мінімальною. Значення достатньо перебирати від 2 до . Має місце співвідношення:
Таким чином
Приклад
Вирахуємо відповідь для :
Число 7 можна представити 6 одиницями, а саме:
int res[5001]; scanf("%d",&n); res[1] = 1; for(i = 2; i <= n; i++) { res[i] = i; for(j = 1; 2 * j < i; j++) if (res[j] + res[i-j] < res[i]) res[i] = res[j] + res[i-j]; for(j = 2; j * j <= i; j++) if (i % j == 0) if (res[j] + res[i/j] < res[i]) res[i] = res[j] + res[i/j]; } printf("%d\n",res[n]);