题目描述
给定 个整数: a1,a2,…,4n,请判定能否将它们分成两个部分(不得丢弃任何数字),每部分的数字之和-
样大。
输入格式
第一行:单个整数 n;
第二行:n 个整数,表示 a1,a2,…·,an 。
输出格式
若能否平分,
输出
否则输出 No
Matched
数据范围
。对于 50% 的数据,1 ≤n≤ 18;
。对于 100% 的数据,1≤n< 24;
。 -10.000.000<ai< 10,000,000
样例数据
输入:
4
123 4
输出:
Matched
说明:
1+4=2+3
输入:
2 2 2
输出:
No
分析
知识点:枚举
解题思路:
对于每个数,一共有放入 A / B A/B A/B 集合两种情况,我们记所有数的和为 S S S 依次考虑每个数是否放入 A A A 并用 s u m sum sum 表示集合 A A A 内数的值
对于一种枚举的情况,若有 2 ∗ s u m = S 2*sum=S 2∗sum=S 则说明可以平分,若对于所有情况这个式子都不成立,则不可以评分
复杂度 O ( 2 n ) O(2^n) O(2n)
代码
#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define LL long long
using namespace std;
int const N=1e5+10,mo=1e9+7;
int n,a[N],s,op;
void dfs(int x,int sum){
if(op) return;
if(x==n+1){
if(sum*2==s) op=1;
return;
}
dfs(x+1,sum+a[x]);
dfs(x+1,sum);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]),s+=a[i];
dfs(1,0);
if(op) printf("Matched");
else printf("No");
}