题解 - 平分数字(一)

题目描述

给定 个整数: 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 2sum=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");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值