拔河比赛(回溯)
【问题描述】 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。 【输入格式】 输入数据的第1行是一个n,表示参加拔河比赛的总人数,n<=100,接下来的n行表示第1到第n个人的体重,每个人的体重都是整数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int a[21],n,sum,res; 4 void dfs(int x,int y,int z) 5 { 6 if(y==n/2) 7 { 8 res=min(res,abs(z*2-sum)); 9 return ; 10 } 11 if(x>n) return ; 12 dfs(x+1,y,z); 13 dfs(x+1,y+1,z+a[x]); 14 } 15 int main() 16 { 17 int t; 18 cin>>t; 19 while(t--) 20 { 21 cin>>n; 22 sum=0; 23 for(int i=1;i<=n;i++) 24 { 25 cin>>a[i]; 26 sum+=a[i]; 27 } 28 res=1000000; 29 dfs(1,0,0); 30 cout<<res<<endl; 31 } 32 return 0; 33 }

浙公网安备 33010602011771号