以下代码的行为就好像我已将变量 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的值时,它给了我垃圾值,但是当我取消注释它时,它给了我预期的值。我不了解该语言的高级概念。为什么会这样?
答案 0 :(得分:0)
dp[0][*]
和dp[*][0]
未初始化。
然后,如果h[i]
为0,您肯定会将一个酉值复制到res
。
在这种情况下,advanced concepts of the language
只是未初始化的变量导致未定义的行为,不应该使用。见Default variable value(由Kelvin Lai评论)。
所以你可以接受这一点,并且不要试图弄清楚为什么打印这些值会解决问题....因为没有必要试图确定未定义的行为是如何工作的......; - )
注意:帖子中的注释行修复问题的事实可能是编译器/平台/配置特定的。它只是一种极端情况,可以解决未初始化变量在不应该使用时的问题......