boolean — целое число не получает типизированное значение bool в переполнении стека

Во время кодирования я столкнулся с ошибкой во время выполнения. Это мой код:

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.
Постскриптум : Вместо || Я тоже пробовал | поскольку это побитовый оператор, но все равно я получаю ошибку во время выполнения. Кто-нибудь, пожалуйста, помогите мне получить ответ.

-5

Решение

Наиболее вероятной причиной ошибки во время выполнения является строка

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

И, скорее всего, dp[i-a[j-1]], который получает индекс в зависимости от значения в a массив. Это может легко привести к dp индексируется отрицательным значением.

Это подозрение также подтверждается тем фактом, что оно «работает» с || (логический или), но не работает ни с ^ или же | (бинарные операторы). Это потому, что логические операторы имеют оценку короткого замыкания (если dp[i][j] истинно, второй оператор не нужен и вообще не вычисляется), тогда как бинарные операторы всегда оценивают оба операнда.

Так что, похоже, что в случае || второй операнд не оценивается, поэтому он не падает, тогда как с двоичными операторами он оценивается, и индекс выходит за границы и вылетает из приложения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector