又一年拔河比赛

一些废话:

怎么说写完前两道题再写这道题思路就顺畅多了。但还是写了半个小时。

依然是 dfs 。。。和上两道题思路挺像的。


 

首先,根据

拔河比赛两边人数最多不能相差 1。
可得:如果 n 是偶数那么两组的人数就只能相等,如果 n 是奇数那么我们只要选出人数为 (n-1)/2 的一组就行了。
所以要选的人数即为 n/2 。
要使两队体重最接近,可以根据体重总和求出另一组的体重,不断更新答案。
注意多组数据要每次给变量赋初值。
最后放下代码:
 
#include<bits/stdc++.h>
using namespace std;
int t,n,a[21],sum,ans = 1e9,b;
void dfs(int s,int t,int p)//传递到第几位,目前的人数,目前的和 
{
    if(s > n + 1) return;
    if(t >= n / 2)
    {
        ans = min(abs(2 * p - sum),ans);
        return;
    }
    dfs(s + 1,t + 1,p + a[s]);
    dfs(s + 1,t,p);
    return;
}
int main()
{
    scanf("%d",&t);
    while(t --)
    {
        ans = 1e9;sum = 0;//第一次就写错在这里了qwq
        scanf("%d",&n);
        for(int i = 1;i <= n;i ++)
        {
            scanf("%d",&a[i]);
            sum += a[i];
        }
        dfs(1,0,0);
        cout << ans << endl;
    }
    return 0;
}

 

upd on 2022.09.29:刷 ybt 看到这道题才发现原来的代码是错的。现已改正。

posted @ 2020-11-27 20:46  樱雪喵  阅读(255)  评论(1编辑  收藏  举报