【DFS】Ybt_拔河比赛

一场拔河,给出所有人都体重,让你将他们分成两队:

  1. 拔河比赛两边人数最多不能相差 1。
  2. 每个队员都有体重,我们要使两边比赛的人体重和相差最小。

多组数据。
其中 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();
}

猜你喜欢

转载自blog.csdn.net/qq_42937087/article/details/112384413