学***佬思路
#include <iostream>
// #include <cstring>
#include <memory.h>
using namespace std;
const int N = 1e5 + 10;
int nums[N], dp[N];
int n, sum, sum1, sum2, res;
int main(){
cin >> n;
for(int i=1; i<=n; ++i){
cin >> nums[i];
sum += nums[i];
}
for(int i=1; i<=n; ++i)
for(int j=sum/2; j-nums[i]>=0; --j)
dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);
sum1 = dp[sum/2];
memset(dp, -1, sizeof dp);
dp[0] = 0;
for(int i=1; i<=n; ++i)
for(int j=sum1; j-nums[i]>=0; --j)
if(dp[j-nums[i]] != -1)
dp[j] = max(dp[j], dp[j-nums[i]] + 1);
res = abs(dp[sum1] - (n - dp[sum1]));
sum2 = sum - sum1;
memset(dp, -1, sizeof dp);
dp[0] = 0;
for(int i=1; i<=n; ++i)
for(int j=sum2; j-nums[i]>=0; --j)
if(dp[j-nums[i]] != -1)
dp[j] = max(dp[j], dp[j-nums[i]] + 1);
res = max(res, abs(dp[sum2] - (n - dp[sum2])));
cout << abs(sum1 - sum2) << ' ' << res << endl;
return 0;
}