1 条题解

  • 0
    @ 2026-1-28 14:27:12
    #include<bits/stdc++.h>
    using namespace std;
    // [1] arr:存储每个人的体重数据;dp:动态规划数组,dp[j]表示容量为j时能容纳的最大体重和
    int arr[200]; 
    int  dp[45100]={};
    
    int main(){
        int n; // [2] n:参与分组的总人数
        cin>>n;
        long long sum=0; // [3] sum:所有人的体重总和
    
        // [4] 读取每个人的体重,并存入数组arr,同时累加计算总重量sum
        for(int i=0;i<n;i++){
            cin>>arr[i];
            sum+=arr[i];
        }
    
        // [5] 0-1背包核心逻辑:计算在sum/2的容量下,能选取的最大体重和(让一组尽可能接近总和的一半)
        for(int i=0;i<n;i++){
            // 逆序遍历背包容量,避免重复选取同一个人的体重
            for(int j=sum/2;j>=arr[i];j--){
                dp[j]=max(dp[j],arr[i]+dp[j-arr[i]]);
            } 
        }
    
        // [6] 比较两组的体重和,按升序输出结果
        if(dp[sum/2]>sum-dp[sum/2]){
            cout<<sum-dp[sum/2]<<" "<<dp[sum/2];
        }else{
            cout<<dp[sum/2]<<" "<<sum-dp[sum/2];
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1351
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者