【ybt高效进阶1-4-1】拔河比赛

拔河比赛

题目链接:ybt高效进阶1-4-1

题目

要把一群人分成两组,要求人数差不超过 1,两组中每个人的值的和相差尽可能小。
求相差值最小是多少。

思路

发现人数最多只有二十个,我们考虑直接深搜。

就直接枚举每一个人在左边还是右边,然后如果两边人数差不超过一,就算两边差值。

然后找到的所有差值算最小的,就是答案了。

代码

#include<cstdio>
#include<iostream>
#include<algorithm>

using namespace std;

int T, n, a[21], ans;

void dfs(int now, int left_num, int dif) {
	if (now == n + 1) {
		if (abs(n - left_num - left_num) > 1) return ;
		ans = min(ans, abs(dif));
		return ;
	}
	dfs(now + 1, left_num + 1, dif + a[now]);//这个人去左边
	dfs(now + 1, left_num, dif - a[now]);//这个人去右边
}

int main() {
	scanf("%d", &T);
	for (int times = 1; times <= T; times++) {
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		
		ans = 2147483647;
		dfs(1, 0, 0);
		
		printf("%d\n", ans);
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值