【发布时间】:2021-06-10 23:24:17
【问题描述】:
给定一个整数 N 表示线段的长度。您需要以这样一种方式切割线段,即每次切割线段的长度为 x 、 y 或 z 。这里 x、y 和 z 是整数。
执行所有剪切操作后,您的剪切段总数必须达到最大值。
示例 1
Input:
N = 4
x = 2, y = 1, z = 1
Output: 4
Explanation:Total length is 4, and the cut
lengths are 2, 1 and 1. We can make
maximum 4 segments each of length 1.
示例 2
Input:
N = 5
x = 5, y = 3, z = 2
Output: 2
Explanation: Here total length is 5, and
the cut lengths are 5, 3 and 2. We can
make two segments of lengths 3 and 2.
这是我的解决方案
int max_seg(int M[], int n, int x, int y, int z)
{
if( (n<=0) && (M[0] != -1) )
return M[0];
else if( (n>0) && M[n] != -1)
return M[n];
int q;
if(n <= 0)
{
q = 0;
M[0] = q;
return M[0];
}
else
{
q = max({1 + max_seg(M, n-x, x, y, z), 1 + max_seg(M, n-y, x, y, z), 1 + max_seg(M, n-y, x, y, z) });
M[n] = q;
return M[n];
}
}
int maximizeTheCuts(int n, int x, int y, int z)
{
//Your code here
int M[n+1] = {0}; // compiler does permit this
for(int i=0; i<=n; i++)
M[i] = -1;
return max_seg(M, n, x, y, z);
}
我的代码有什么问题。任何帮助表示赞赏。
下面的测试用例失败了
N= 4000
x=3 y=4 z=5
returned 1334 instead of 1333
【问题讨论】:
-
针对特定测试用例,在使用调试器逐行执行代码时,您观察到了什么? Add that information to your question please.
-
max_seg不会拒绝使n为负数的解决方案,因此它会找到一个解决方案,该解决方案使 1334 个长度为 3 的剪切;别介意这个解决方案会留下一段长度为 -2 的片段。一般来说,你的程序总是返回ceil(n/min(x, y, z))。 -
@IgorTandetnik 我该如何解决这个问题。谢谢
-
你需要确保
max_seg永远不会用负数n调用,否则,如果用负数n调用,它会返回一个不会被采用的值作为最佳解决方案。 -
@IgorTandetnik yessssss 谢谢修复它......你的建议很有帮助。
标签: c++ algorithm dynamic-programming