【YbtOJ高效进阶 深搜-1】拔河比赛

链接

YbtOJ高效进阶 深搜-1

题目描述

在浙江师范大学 ACM 集训队,队员平时集训脑力劳动力比较重。为了劳逸结合,我们敬爱的韩老师准备了一场拔河比赛,让队员放松心情。

为了拔河比赛的公正性,韩老师提出以下要求:
1.拔河比赛两边人数最多不能相差1 。
2.每个队员都有体重,我们要使两边比赛的人体重和相差最小。

现在有 N 个队员,韩老师想你帮忙分配,并且把分配后两边体重和之差最小值输出。
输入:第一个数是数据组数

样例输入

1
3
55 50 100

样例输出

5

思路

深搜
既然数量之差最多只能1,那么一份至少有 ⌊ n 2 ⌋ \left\lfloor\dfrac{n}{2}\right\rfloor 2n
那我们就搞每一个点,看它是分到这堆还是另一堆,每次数量到达上限就判断一次答案即可
时间复杂度 2 n 2^n 2n

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>

using namespace std;

int T, n, S, ans = 1e9;
int w[100005];

void dfs(int x, int num, int sum)
{
    
    
	if(num == n / 2) {
    
    
		ans = min(ans, abs(S - sum * 2));
		return;
	}
	if(x >= n) return;
	dfs(x + 1, num + 1, sum + w[x + 1]);
	dfs(x + 1, num, sum);
} 

int main()
{
    
    
	scanf("%d", &T);
	for(int i = 1; i <= T; ++i)
	{
    
    
		ans = 1e9, S = 0;
		scanf("%d", &n);
		for(int j = 1; j <= n; ++j)
			scanf("%d", &w[j]), S += w[j];
		dfs(0, 0, 0);
		printf("%d\n", ans);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/112387370
今日推荐