Во время кодирования я столкнулся с ошибкой во время выполнения. Это мой код:
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.
Постскриптум : Вместо || Я тоже пробовал | поскольку это побитовый оператор, но все равно я получаю ошибку во время выполнения. Кто-нибудь, пожалуйста, помогите мне получить ответ.
Наиболее вероятной причиной ошибки во время выполнения является строка
dp[i][j]=(dp[i][j])^(dp[i-a[j-1]][j-1]);
И, скорее всего, dp[i-a[j-1]]
, который получает индекс в зависимости от значения в a
массив. Это может легко привести к dp
индексируется отрицательным значением.
Это подозрение также подтверждается тем фактом, что оно «работает» с ||
(логический или), но не работает ни с ^
или же |
(бинарные операторы). Это потому, что логические операторы имеют оценку короткого замыкания (если dp[i][j]
истинно, второй оператор не нужен и вообще не вычисляется), тогда как бинарные операторы всегда оценивают оба операнда.
Так что, похоже, что в случае ||
второй операнд не оценивается, поэтому он не падает, тогда как с двоичными операторами он оценивается, и индекс выходит за границы и вылетает из приложения.
Других решений пока нет …