题意:
t个问题,每个问题有n个数,任意选取数字(选取的数量>=1)的和是3600的倍数。
思路:
我是瞎搞的,用dp[x]=1 表示可以组合为x,dp[x]=0,表示 不可以组合为x,(x=x%3600), 然后直到dp[0]=1 结束。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+177;
int a[maxn];
int dp[maxn],vpt[maxn];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
a[i]=a[i]%3600;
}
memset(dp,0,sizeof(dp));
int cnt;
for(int i=1;i<=n&&!dp[0];i++){
cnt=0;
for(int j=1;j<=3600;j++){
if(dp[j]){
vpt[cnt++]=(j+a[i])%3600;
}
}
for(int j=0;j<cnt;j++){
dp[vpt[j]]=1;
}
dp[a[i]]=1;
}
if(dp[0]==1){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
}
}