其他分享
首页 > 其他分享> > 【dfs】拔河比赛(ybtoj dfs-1-1)

【dfs】拔河比赛(ybtoj dfs-1-1)

作者:互联网

拔河比赛

ybtoj dfs-1-1

题目大意

给你n个数,让你分成两堆,使其数量相差不大于1,问数值相差最小是多少

输入样例

1
3
55 50 100

输出样例

5

数据范围

1 ⩽ T ⩽ 50 1\leqslant T \leqslant 50 1⩽T⩽50
2 ⩽ N ⩽ 20 2\leqslant N\leqslant 20 2⩽N⩽20
30 ⩽ W i ⩽ 120 30\leqslant W_i\leqslant 120 30⩽Wi​⩽120

解题思路

因为N很小,直接枚举每个数放在哪边即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 25
using namespace std;
int t, n, ans, a[N];
void dfs(int x, int l, int g)
{
	if (x > n)
	{
		ans = min(ans, abs(g));
		return;
	}
	if (l < (n + 1) / 2) dfs(x + 1, l + 1, g + a[x]);//放左边
	if (x - l <= (n + 1) / 2) dfs(x + 1, l, g - a[x]);//右边
	return;
}
int main()
{
	scanf("%d", &t);
	while(t--)
	{
		ans = 120*N;
		scanf("%d", &n);
		for (int i = 1; i <= n; ++i)
			scanf("%d", &a[i]);
		dfs(1, 0, 0);
		printf("%d\n", ans);
	}
	return 0;
}

标签:int,ybtoj,dfs,120,拔河比赛,ans,include,leqslant
来源: https://blog.csdn.net/ssllyf/article/details/112387529