D. Array Differentiation
因为相减的顺序可以变化,所以这个环中数的正负性以及相减顺序其实是没有影响的,那么我们可以规定一个方向,然后再枚举所有可能的正负性。
设这环中点分别是 v1,v2,⋯vkv_1,v_2,⋯v_kv1,v2,⋯vk,那么肯定有 (v1−v2)+(v2−v3)+⋯+(vk−v1)=0(v_1−v_2)+(v_2−v_3)+⋯+(v_k−v_1)=0(v1−v2)+(v2−v3)+⋯+(vk−v1)=0,所以只要看 aaa中有没有一些正负随意可以组成 000 就好了。
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
int n,a[20];
bool dfs(int u,int x,bool ok)
{if(u==n+1) return (x==0&&ok);return dfs(u+1,x-a[u],1)||dfs(u+1,x+a[u],1)||dfs(u+1,x,ok);
}
int main()
{int Tc=rd();while(Tc--){n=rd();for(int i=1;i<=n;i++) a[i]=rd();if(dfs(1,0,0))puts("YES");elseputs("NO");}return 0;
}