swjtu2383(Music Problem)

来源:互联网 发布:数据科学家的职业规划 编辑:程序博客网 时间:2024/05/18 13:46

题目链接: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];

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;}