题目链接: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[i+1][j] |= f[i][j];
f[i+1][(j+tt[i])% 3600] |= f[i][j];
f[i+1][(j+tt[i])% 3600] |= f[i][j];
bool类型的 DP ,用现在的状态更新将来的状态
#include <iostream>
#include <cstdio>
#include <memory.h>
#include <algorithm>
using namespace std;
bool f[3700][3700];
int tt[100010];
int main()
{
int t;
cin >> t;
while (t > 0)
{
t--;
int n;
scanf("%d", &n);
for (int i=0; i<n; i++) scanf("%d", &tt[i]);
memset(f,0,sizeof(f));
if (n > 3600)
{
cout << "YES" << endl;
continue;
}
for (int i=0; i<n; i++) f[i+1][tt[i]%3600] = 1;
for (int i=0; i<n; i++)
{
for (int j=0; j<3600; j++)
{
f[i+1][j] |= f[i][j];
f[i+1][(j+tt[i])% 3600] |= f[i][j];
}
}
if (f[n][0])
cout << "YES" << endl;
else
cout << "NO" << endl;
}
return 0;
}