Вам необходимо решить эту проблему с помощью динамического программирования.Для данного n
продукта начните заполнять снизу вверх.Ниже приведен код с вашими тестовыми примерами:
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
int main()
{
int n = -1, i =0, tmp=0;
// int result = -1;
printf("\nEnter value: ");
scanf("%d", &n);
if (n == -1)
return -1;
if(n == 1)
{
printf("\nOnly a single day");
return 0;
}
int *arr = malloc(n*sizeof(int));
for (i=0; i<n; i++)
arr[i]=INT_MAX;
arr[0] = 1;
for(i=1; i<n; i++)
{
arr[i] = arr[i-1] + 1;
if ((i+1)%2 == 0)
{
tmp = arr[(i+1)/2 - 1] + 1;
if (tmp < arr[i])
arr[i] = tmp;
}
}
printf("\nResult: %d", arr[n-1]-1);
}
Вывод:
Контрольный пример 1:
Enter value: 8
Result: 3
Контрольный пример 2:
Enter value: 15
Result: 6
Контрольный пример 3:
Enter value: 19
Result: 6
КОД ОБЪЯСНЕНИЕ:
Вам нужно создать массив, содержащий столько элементов, сколько это значение.Например,если значение равно 8, вам нужно создать массив из 8 элементов.Затем вам нужно разобраться со значением от 2,3,4 .... до 8. Нет необходимости в значении 1, поскольку, когда вы начинаете, проблема говорит о том, что у вас уже есть 1
.Значение в элементах массива обозначает количество дней.Индекс массива таков, что index = value -1
.
Ваша конечная цель - добраться до 8
.Но вам нужно начать снизу вверх.Вам нужно спросить себя, что вы можете сделать лучше всего (минимальное количество дней) со значением 2
?Это либо значение предыдущего элемента +1 (поскольку в задаче указано, что вы либо делаете day's value = previous day's value + 1
), либо лучшее, что вы делали со значением, равным половине текущего значения плюс 1
(в задаче указано, что вы можете умножить также на 2в другой раз).Какое бы число ни было меньше, вы назначаете его индексу текущего значения.Эта логика находится внутри цикла for
для каждого индекса.
Вы повторяете шаги для 3,4, .... до 8. Теперь, когда вы достигнете 8
, значение индекса (8-1
) содержат дни, включая начало, поэтому необходимо вычесть 1 и, наконец, отобразить значение.