AC

许诺  •  4天前


#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

using namespace std;

int main() {

int n;
cin >> n;
vector<int> weights(n);
int total = 0;
for (int i = 0; i < n; ++i) {
    cin >> weights[i];
    total += weights[i];
}
int half_n = n / 2;
int max_possible = 450 * 100; 
vector<vector<bool>> dp(half_n + 2, vector<bool>(max_possible + 1, false));
dp[0][0] = true;

for (int i = 0; i < n; ++i) {
    int weight = weights[i];
    for (int j = half_n; j >= 0; --j) {
        for (int k = max_possible; k >= 0; --k) {
            if (dp[j][k] && j + 1 <= half_n + 1 && k + weight <= max_possible) {
                dp[j + 1][k + weight] = dp[j + 1][k + weight] || dp[j][k];
            }
        }
    }
}

int best = 0;
int half_total = total / 2;
for (int k = half_total; k >= 0; --k) {
    bool found = false;
    for (int j = half_n; j <= half_n + 1; ++j) {
        if (j <= n && dp[j][k]) {
            found = true;
            break;
        }
    }
    if (found) {
        best = k;
        break;
    }
}

int other = total - best;
if (best < other) {
    cout << best << " " << other << endl;
} else {
    cout << other << " " << best << endl;
}

return 0;

}


评论:

请先登录,才能进行评论