拔河比赛
ybtoj dfs-1-1
题目大意
给你n个数,让你分成两堆,使其数量相差不大于1,问数值相差最小是多少
输入样例
1
3
55 50 100
输出样例
5
数据范围
1⩽T⩽501\leqslant T \leqslant 501⩽T⩽50
2⩽N⩽202\leqslant N\leqslant 202⩽N⩽20
30⩽Wi⩽12030\leqslant W_i\leqslant 12030⩽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;
}