1 条题解
-
0
#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
- 上传者