学***佬思路
#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;
}