http://swjtuoj.cn/problem/2383/
题解
´
当
n
大于
3600
时,一定可以,证明:当
(
presum
[
i
]-
presum
[j])%3600 == 0
时,成立,根据抽屉原理,当
n > 3600
时,一定有
presum
[
i
] ==
presum
[j](mod 3600)
´
当
n<=3600
时,
dp
´
f[p][(
j+a
[
i
])%mod] |= f[p^1][j];
´
f[p][j] |= f[p^1][j];
新的姿势,用二级制来进行前后关系的递推!1!!!贼强!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<string>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int a[100010];
int dp[13000][2];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int flag=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i]%=3600;
if(a[i]==0)
{
flag=1;
}
}
if(n>3600)
{
flag=1;
}
if(flag)
{
printf("YES\n");
continue;
}
memset(dp,0,sizeof(dp));
dp[0][0]=dp[0][1]=1;
for(int i=1;i<=n;i++)
{
int tmp=i&1;
int tmpp=tmp^1;
for(int j=0;j<=3600;j++)
{
int tt=j+a[i];
if(tt>3600)
tt%=3600;
dp[tt][tmp] |=dp[j][tmpp];
dp[j][tmp] |=dp[j][tmpp];
}
}
//printf("%d %d\n",dp[3600][0],dp[3600][1]);
if(dp[3600][0]||dp[3600][1])
{
printf("YES\n");
}
else
printf("NO\n");
}
return 0;
}