题目链接:http://codeforces.com/contest/1097/problem/B
题意:给你n个数字,让这n个数字相加减,如果是360的倍数或者是0就输出YES,否则输出NO。
思路:二进制枚举每一种状态,或者直接暴力搜索。
二进制枚举:
#include<bits/stdc++.h>
using namespace std;
const int maxn=4005,inf=1e8;
int a[maxn], n;
int main()
{
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
for(int i = 1; i < (1 << n); i++)
{
int sum = 0;
for(int j = 0; j < n; j++)
{
if(i & (1 << j)) sum += a[j];
else sum -= a[j];
}
if( !sum || !(sum % 360)) return puts("YES"),0;
}
puts("NO");
}
dfs :
#include<bits/stdc++.h>
using namespace std;
const int maxn=4005,inf=1e8;
int a[maxn], n;
bool flag;
void dfs(int x, int sum)
{
if(x == n)
{
if(!(sum % 360)) flag = true;
return;
}
dfs(x + 1, sum + a[x]);
dfs(x + 1, sum - a[x]);
}
int main()
{
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
flag = false; dfs(0,0);
if(flag) puts("YES");
else puts("NO");
return 0;
}