【发布时间】:2015-10-26 04:41:42
【问题描述】:
如果我在第一次使用它时取消注释上面的行,下面的代码的行为就像我已将变量 res 初始化为 0。
int t, mi,cur,n,res;
scanf("%d",&t);
while(t-- && scanf("%d",&n) == 1)
{
for (int i = 1; i <= n; ++i)
{
scanf("%d",&h[i]);
}
for (int i = 1; i <= n; ++i)
{
scanf("%d",&k[i]);
}
for (int i = 0; i < 1001; ++i)
dp[0][i] = INF;
for (int i = 0; i < 501; ++i)
dp[i][0] = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= 2*n; ++j)
{
dp[i][j] = dp[i-1][j];
if(j >= k[i-1])
dp[i][j] = min(dp[i-1][j],1 + dp[i][j-k[i-1]]);
}
}
// The lines below.
//for (int i = 0; i <= n; ++i)
//{
// for (int j = 0; j <= 2*n; ++j)
// {
// printf("%d ", dp[i][j]);
// }
// printf("\n");
//}
for (int i = 1; i <= n; ++i)
{
res += dp[n][2*h[i]];
}
printf("%d\n", res);
当我打印带有注释行的 res 的值时,它给了我垃圾值,但是当我取消注释它时,它给了我预期的值。我不知道语言的高级概念。为什么会这样?
【问题讨论】:
-
我相信如果你不初始化
res的值会是什么,我相信是无法保证的。所以它可能等于0,或者其他任何东西。在任何情况下都不要依赖它。 -
您的代码肯定会表现出未定义行为的症状。使用
int i = 1; i <= n; ++i指出使用错误的索引和访问数组越界。请发布Minimal, Complete, and Verifiable example。这将有助于更准确地诊断问题。