【YBT高效进阶】1基础算法/4深度优先搜索/1拔河比赛

【YBT高效进阶】1基础算法/4深度优先搜索/1拔河比赛

内存限制:256 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较

题目描述

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

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

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

输入格式

首先输入 T T T ,表示有 T T T 组样例。

每个样例:

首先输入人数 N N N,占一行。

后面跟着 N N N 个数,表示 N N N个人的体重 W 1 − W n W_1 - W_n W1Wn

输出格式

对于每个样例输出一行,一个整数表示两边体重之差的绝对值。

样例

样例输入

1
3
55 50 100

样例输出

5

数据范围与提示

对于 100% 的数据,有 1 < = T < = 50 , 2 < = N < = 20 , 30 < = W i < = 120 1<=T<=50,2<=N<=20,30<=W_i<=120 1<=T<=502<=N<=2030<=Wi<=120

思路

每个人只有在左队和右队两种情况
深度优先搜索O(2N);

代码

#include<iostream>
#include<cmath>
using namespace std;
int n,sum,w[21],ans;
void DFS(int dep,int s,int rs)//dep当前人,s一边体重和,rs一边人数和 
{
    
    
	if(dep>n)
	{
    
    
		ans=min(ans,abs(sum-(s<<1)));
		return;
	}
	if(rs<(n+1)>>1)//可以加人 
		DFS(dep+1,s+w[dep],rs+1);
	if(dep-rs<=(n+1)>>1)
		DFS(dep+1,s,rs);
	return;
}
int main()
{
    
    
	int T,i;
	ios::sync_with_stdio(false);
	for(cin>>T;T--;)
	{
    
    
		for(cin>>n,sum=0,ans=100000000,i=1;i<=n;i++)
			cin>>w[i],sum+=w[i];
		DFS(1,0,0),cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_46975572/article/details/115144273
今日推荐