给定一个如下图所示的全圆量角器。
初始时,量角器上的指针指向刻度 0。
现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针)由你自由决定。
请你判断,能否通过合理选择每次拨动的方向,使得指针最终仍然指向刻度 0。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一个整数 ai,表示一次操作的拨动角度。
输出格式
如果可以做到指针最终仍然指向刻度 0,则输出 YES
,否则输出 NO
。
数据范围
前 4 个测试点满足 1≤n≤3。
所有测试点满足 1≤n≤15,1≤ai≤180。
输入样例1:
3
10
20
30
输出样例1:
YES
输入样例2:
3
10
10
10
输出样例2:
NO
输入样例3:
3
120
120
120
输出样例3:
YES
dfs做法
#include <iostream>
using namespace std;
int n;
const int N = 20;
bool st;
int a[N];
void dfs(int t, int r)
{
if(t == n + 1 )
{
if(r % 360 == 0) st = true;
return ;
}
dfs(t + 1, r + a[t]);
dfs(t + 1, r - a[t]);
}
int main()
{
scanf("%d", &n);
for(int i = 0; i< n; i ++) scanf("%d", &a[i]);
dfs(0, 0);
if(st) cout << "YES";
else cout << "NO";
return 0;
}
二进制枚举
#include <iostream>
using namespace std;
const int N = 20,M=1<<16 ;
int a[N], f[M];
int n;
bool st;
int main()
{
cin >> n;
for(int i = 0; i < n; i ++) scanf("%d", &a[i]);
for(int i = 0; i < (1 << n); i ++)
{
for(int j = 0; j < n; j ++)
{
if(i >> j & 1) f[i] += a[j];
else f[i] -= a[j];
}
if(f[i]%360==0) st = true;
}
if(st == false) cout << "NO";
else cout << "YES";
return 0;
}