解析
与取模结合的动归,正常做即可
问题
眼瞎!!!
这个序列的每个数都必须用到!!!
if(f[i-1][j]) f[i][j]=1;
上面这行就是不对的!!!
头疼
仔细审题
opj的题你说它水,你倒是切啊
qwq 枯了
代码
(f数组可以用滚动数组优化一下空间复杂度,但就本题数据范围来说不用了)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=105;
int n;
int f[11000][N];
int k;
int main(){
int a;
scanf("%d%d",&n,&k);
scanf("%d",&a);
f[1][a%k]=1;
f[1][(-a%k+k)%k]=1;
for(int i=2;i<=n;i++){
scanf("%d",&a);
// printf("a=%d:\n",a);
for(int j=0;j<k;j++){
if(f[i-1][j]){
//f[i][j]=1;
f[i][(j+a)%k]=1;
f[i][((j-a)%k+k)%k]=1;
}
// printf(" j=%d jia=%d jian=%d jd=%d\n",j,jia(j,a),jian(j,a),f[i][j]);
}
}
if(f[n][0]) printf("YES\n");
else printf("NO\n");
return 0;
}
/*
2 3
3 1
*/