拔河比赛(回溯)

【问题描述】 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过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 }

 

posted @ 2022-01-23 09:57  jetaim  阅读(517)  评论(0)    收藏  举报