一场拔河,给出所有人都体重,让你将他们分成两队:
- 拔河比赛两边人数最多不能相差 1。
- 每个队员都有体重,我们要使两边比赛的人体重和相差最小。
多组数据。
其中 1 <= T <= 50 , n <= 20 , 30 <= W_i <= 120
以上。
解
由于数据十分小。所以直接暴力DFS即可。
代码
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int n, sum, ans, a[31], T;
void dfs(int no, int weigh, int d1){
if(no == n + 1) {
//搜完拉
if(abs((n-d1)-d1) <= 1) //人数符合条件
ans = min(ans, abs(weigh - (sum - weigh))); //新答案
return;
}
if(d1 <= n/2) dfs(no+1, weigh+a[no], d1+1); //放入第一队
if(no - d1 <= n/2) dfs(no+1, weigh, d1); //第二队
}
void work(){
scanf("%d",&n);
sum = 0; ans = 1000000;
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
sum = sum + a[i];
}
dfs(1,0,0); //深搜
printf("%d\n",ans);
}
int main(){
scanf("%d", &T); //多组数据
while(T--) work();
}