Programming_question 关于动态规划

Programming_question on dynamic programming

一家公司生产一种产品。生产以一种非常神秘的方式进行。该公司要么在一天内多生产一种产品,要么他们有能力将前一天的产品产量翻一番。最初他们只有 1 种产品,但有一天他们正好有 "n" 种产品。您需要找出最少天数才能准确地制作出 "n" 件产品。 测试用例: n = 8 输出 = 3 解释:如果每天产量翻倍,则三天内可以生产 1 x 2 x 2 x 2 = 8 件产品。 再多一点: 对于 15 个产品输出 6 对于 19 个产品输出 6

你需要使用动态规划来解决这个问题。对于给定的 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,最后显示该值。