编码时遇到运行时错误。这是我的代码:
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];
}
这里的总和总是积极的。经过大量的调试后我无法得到答案所以在从解决方案中找到答案之后。这就是答案。
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。 附: :而不是||我也试过了因为这是按位运算符,但我仍然遇到运行时错误。有人请帮我解答。
答案 0 :(得分:1)
运行时错误的最可能原因似乎是
行dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);
最有可能是dp[i-a[j-1]]
,它根据a
数组中的值获取索引。这很容易导致dp
被负值索引。
这种怀疑还得到以下事实的支持:它与||
(逻辑或)一起工作,但不适用于^
或|
(二元运算符)。这是因为逻辑运算符具有短路评估(如果dp[i][j]
为真,则第二个运算符不需要且根本不进行求值),而二元运算符总是评估两个操作数。
所以似乎在||
的情况下,第二个操作数没有被评估,因此它不会崩溃,而对于二元运算符,它被评估并且索引超出范围并崩溃应用程序。