[英]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.