-5

在编码时,我遇到了运行时错误。这是我的代码:

int f(int a[],int n,int sum)
{
    int dp[sum+1][n+1];
    for(int i=0;i<=n;i++)
    dp[0][i]=1;

    for(int i=1;i<=sum;i++)
    dp[i][0]=0;

    for(int i=1;i<=sum;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(i>=a[j-1])
            dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);
        }
    }

    return dp[sum][n];
}

这里 sum 总是正数。经过大量调试后,我无法得到答案所以在匹配我从解决方案中得到的答案之后。这就是答案。

bool f(int a[],int n,int sum)
{
    bool dp[sum+1][n+1];
    for(int i=0;i<=n;i++)
    dp[0][i]=true;

    for(int i=1;i<=sum;i++)
    dp[i][0]=false;

    for(int i=1;i<=sum;i++)
    {
        for(int j=1;j<=n;j++)
        {
            dp[i][j]=dp[i][j-1];
            if(i>=a[j-1])
            dp[i][j]=(dp[i][j])||(dp[i-a[j-1]][j-1]);
        }
    }

    return dp[sum][n];
}

所以我的问题是为什么 int 不能转换为 bool。PS:而不是|| 我也试过 | 因为这是按位运算符,但仍然出现运行时错误。有人请帮助我得到答案。

4

1 回答 1

1

运行时错误的最可能原因似乎是该行

dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);

最有可能的是dp[i-a[j-1]],它根据a数组中的值获取索引。这很容易导致dp被负值索引。

这种怀疑也得到以下事实的支持:它与||(逻辑或)“工作”但不能与^|(二元运算符)一起工作。这是因为逻辑运算符具有短路求值(如果dp[i][j]为真,则第二个运算符不需要并且根本不求值),而二元运算符总是求值两个操作数。

因此,似乎在||第二个操作数未评估的情况下,它不会崩溃,而对于二元运算符,它会被评估并且索引超出范围并使应用程序崩溃。

于 2017-06-14T09:53:25.523 回答