又一年拔河问题

题目:T组数据,n个人,第n个人体重w[n],分成两组,两组人数最大差1,求两组体重差绝对值最小值

思路:一共分两组,设第一组体重和为w1,第二组为w2,则w1+w2=W,|w1-w2|=|2*w1-W|。所以只需要找出其中一组总重量的二倍与全部人总重量的差的绝对值的最小值就可以。所以只需要求其中一组总重量。因为两组人数最多相差1,所以其中一组的总人数一定是n/2,从而通过递归回溯的方法解决。

总程序:

#include<bits/stdc++.h>
using namespace std;
int w[21],W=0,wxmin=121,n;
void PaiXu(int x,int y,int z){                                               //x为新加的人的序号,y为总重量,z为当前组中人数
    if(z==n/2){
        if(abs(y-W/2)<wxmin){
            wxmin=abs(y*2-W);
            return;
        }
    }
    if(x>n) return;
    PaiXu(x+1,y,z);                                  //选
    PaiXu(x+1,y+w[x],z+1);                      //不选
}
int main(){
    int T;
    scanf("%d",&T);
    for(int i=0;i<T;i++){
        scanf("%d",&n);
        W=0;wxmin=10001;
        for(int j=1;j<=n;j++){
            scanf("%d",&w[j]);
            W+=w[j];
        }
        PaiXu(1,0,0);
        printf("%d\n",wxmin);
    }
    return 0;
}

posted @ 2022-01-23 10:58  LZMiiu  阅读(43)  评论(0编辑  收藏  举报