【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 W1−Wn。
输出格式
对于每个样例输出一行,一个整数表示两边体重之差的绝对值。
样例
样例输入
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<=50,2<=N<=20,30<=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;
}