1:二进制枚举子集
#include <iostream>
#include <stdio.h>
int main() {
int n,ans,num[20];
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",&num[i]);
for(int i=0;i<(1<<n);i++){ //枚举2^n-1个状态
ans=0;
for(int j=0;j<n;j++){ //遍历二进制的每一位
if(i&1<<j) ans+=num[j]; //判断n的第j为是否为1
else ans-=num[j];
}
if(ans%360==0) {
printf("YES\n");
return 0;
}
}
printf("NO\n");
return 0;
}
2:深度优先搜索(DFS)
#include <iostream>
#include <stdio.h>
#include <string.h>
int n,flag=0,num[100],book[1000];
int ju(){
int ans=0;
for(int i=1;i<=n;i++){
if(book[i]) ans+=num[i];
else ans-=num[i];
}
return (ans%360)==0;
}
void dfs(int x){
if(flag) return;
if(x==n+1) {
if(ju()) flag=1;
return ;
}
book[x]=1;
dfs(x+1);
book[x]=0;
dfs(x+1);
}
int main() {
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
dfs(1);
if(flag) printf("YES\n");
else printf("NO\n");
return 0;
}