Alqoritm təhlili
-i ədədini təşkil edə biləcək ən kiçik birliklərin sayına bərabər edək. Açıq-aydındır ki, .
2 ədədi yalnız iki birliyin cəmi kimi təqdim etmək olar: . Buna görə, . 3 ədədi yalnız üç birliyin cəmi kimi təqdim etmək olar: . Buna görə, .
4 ədədi ya kimi, ya da kimi təqdim etmək olar. Lakin, hər iki halda dörd birlik istifadə edilir. Buna görə, .
Axtarılan ifadəni nəzərdən keçirək, nəticəsi -ə bərabərdir.
Fərz edək ki, son əməliyyat toplama olub. Məsələn, birinci toplanan birlikdən ibarətdir və ikinci toplanan birlikdən ibarətdir. dəyəri belə seçilməlidir ki, cəmi minimal olsun.
Eyni zamanda, dəyərini -yə qədər iterasiya etmək kifayətdir, çünki birinci toplananın ikincidən böyük olmadığını fərz etmək olar. Beləliklə, aşağıdakı münasibət qüvvədədir:
Fərz edək ki, son əməliyyat vurma olub. Məsələn, birinci çarpan birlikdən ibarətdir və ikinci çarpan birlikdən ibarətdir. Bu hal -yə bölünərsə baş verir.
dəyəri belə seçilməlidir ki, cəmi minimal olsun. dəyərini 2-dən -ə qədər iterasiya etmək kifayətdir. Aşağıdakı münasibət qüvvədədir:
Beləliklə
Nümunə
üçün cavabı hesablayaq:
7 ədədi 6 birliklə təqdim edilə bilər, yəni:
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]);