繁体   English   中英

Programming_question on dynamic programming

[英]Programming_question on dynamic programming

一家公司生产一种产品。 制作以一种非常神秘的方式完成。 该公司要么在一天内多生产一件产品,要么他们有权将前一天的产品产量增加一倍。 最初他们只有 1 个产品,一天后他们正好有“n”个产品。 您需要找出最少天数才能准确地制作“n”个产品。 测试案例:n = 8 产量 = 3 解释:如果产量每天增加一倍,那么三天内可以生产 1 x 2 x 2 x 2 = 8 个产品。 更多: 对于 15 个产品 OUTPUT 6 对于 19 个产品 OUTPUT 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 并最终显示该值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM