计蒜客里的习题
用dp[i][j]表示前i个数可以形成j的余数(如果可以则为true否则为false)
#include<bits/stdc++.h>
using namespace std;
const int MAXN=10010;
int main(){
int n,k;
int num[MAXN];
bool dp[MAXN][100];
fill(dp[0],dp[0]+MAXN*100,false);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
num[i]=num[i]%k;
}
dp[1][num[1]]=true;
for(int i=2;i<=n;i++){
for(int j=0;j<k;j++){
if(dp[i-1][j]) {
dp[i][(j+num[i])%k]=true;
dp[i][((j-num[i]+k)%k)%k]=true;
}
}
}
if(dp[n][0]) printf("YES\n");
else printf("NO\n");
return 0;
}