关于动态编程的Programming_question

时间:2019-03-03 06:12:06

标签: algorithm dynamic-programming greedy

一家公司生产产品。生产以非常神秘的方式完成。该公司或者一天要生产一种额外的产品,或者可以将前一天的产品产量提高一倍。最初,他们只有1种产品,一天后,它们恰好具有“ n”种产品。您需要找出最少的天数才能制作出完全“ n”个产品。 测试用例: n = 8 输出= 3 说明:如果每天的产量翻一番,那么三天之内可以生产1 x 2 x 2 x 2 = 8个产品。 再多一点: 15产品OUTPUT 6 对于19个产品OUTPUT 6

1 个答案:

答案 0 :(得分:0)

您需要使用动态编程解决此问题。对于给定的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并最终显示该值。