这是AC代码
#include<bits/stdc++.h>
using namespace std;
int m,n,k;
int a[10005];
bool dp[10005][105];
int main()
{
cin>>m;
for(int z=1;z<=m;z++)
{
memset(dp,0,sizeof(dp));
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
a[i]%=k;
}
dp[0][0]=1;
dp[1][(a[1]+k)%k]=1;
dp[1][(-a[1]+k)%k]=1;
for(int i=2;i<=n;i++)
{
for(int j=0;j<k;j++)
{
if(dp[i-1][j])
{
dp[i][(j+a[i]+k)%k]=1;
dp[i][(j-a[i]+k)%k]=1;
}
}
}
if(dp[n][0])cout<<"Divisible"<<endl;
else cout<<"Not divisible"<<endl;
}
return 0;
}
我想问的是,为什么dp[1][(-a[1]+k)%k]=1 这一句代码去掉之后还能AC?
我之前一直没加这一段代码,调的时候看题解都有这一句,就加了上去,但是没有理解为什么要加,求助
如果大神有空来帮助我的话,麻烦看看这道一本通上基本一样的题目http://ybt.ssoier.cn:8088/problem_show.php?pid=1195 按照我的理解,这道一本通的题应该加dp[1][(-a[1]+k)%k]=1,但是不加也能过,说明我对这句代码没理解到位,麻烦大家解释一下