A. 【例题1】拔河比赛
题目
题解
由于本题数据过水,用爆搜即可过掉。
只考虑一个队伍,搜索每个人加不加进这个队伍里,若不加其实就是加进另一个队。
若当前加的人数未达半数,即可加进去;
若当前没加的人数未达半数,即可不加进去
代码
#include<iostream>
#include<cmath>
using namespace std;
int t,n,m,ans,a[100];
void dfs(int dep,int c1,int c2,int sum,int n)//c1记录一队人数,c2记录未加进一队的人数(二队人数),sum记录一队重量
{
if(dep>n)
{
int sum2=m-sum;//另一队重量
ans=min(ans,abs(sum-sum2));//统计最小差值
}
else
{
if(c1<(n+1)/2) dfs(dep+1,c1+1,c2,sum+a[dep],n); //当前加的人数未达半数,即可加进去
if(c2<(n+1)/2) dfs(dep+1,c1,c2+1,sum,n); //当前没加的人数未达半数,即可不加进去
}
}
int main()
{
cin>>t;
for(int i=1; i<=t; i++)
{
cin>>n;
m=0;
for(int j=1; j<=n; j++)
{
cin>>a[j];
m+=a[j];//统计总重量
}
ans=0x7f7f7f7f;//ans统计最小答案,要初始化最大值
dfs(1,0,0,0,n);
cout<<ans<<endl;
}
}