思路
这个题啊,一看n=10,就知道肯定不用考虑时间复杂度了,应该是一个指数级别的时间复杂度。
其实就是我把这个考虑成一个数轴,我可以把
a
i
a_i
ai当成一个两个点之间的距离(负数化成正数,因为距离都是正数)。
但是我需要明白的一点就是两个点之间的间隔一定是点数+1,因此我们需要找到这个数轴上的点可以成至少一个环。
因此,选择任意一个距离,他们之和如果能在我们新开的一个map上找到重合的部分,那么就说明我们可以找到这个数值,反之就说明我们不能找到这个数值。
因此可以用一个爆搜。
#pragma GCC optimize(3)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int>mp;
int a[21021000];
int n;
void dfs(int u,int num){
if(num>n){
return;
}
mp[u+a[num]]++;
dfs(u,num+1);
dfs(u+a[num],num+1);
}
int main()
{
int T;
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]<0){
a[i]=-a[i];
}
}
if(n==1){
if(a[1]==0){
cout<<"YES"<<endl;
}else cout<<"NO"<<endl;
continue;
}
mp.clear();
dfs(0,1);
int ju=0;
for(auto t:mp){
if(t.second>=2)ju=1;//cout<<t.first<<endl;
}
if(ju==1)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}