又一年拔河问题

题目: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 @   LZMiiu  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示