Hello 2019 B - Petr and a Combination Lock

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_16554583/article/details/85859150

原题链接:传送门

给你n个数,问你经过加或减的操作,最后和是否能整除360。

二进制枚举
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int a[N];

int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);

    for(int i=0;i<1<<n;i++){
        int s = 0;
        for(int j=0;j<n;j++){
            if(i & (1<<j))
                s += a[j];
            else s -= a[j];
        }
        if(s % 360 == 0)
            return puts("YES"),0;
    }
    puts("NO");

    return 0;
}

搜索
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n;
int a[N];

int fun(int i,int sum){
    if(i == n){
        return (sum%360==0);
    }
    return fun(i+1,sum+a[i]) || fun(i+1,sum-a[i]);
}

int main(){
    scanf("%d",&n);
    int sum = 0;
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    if(fun(0,0))  puts("YES");
    else puts("NO");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_16554583/article/details/85859150