第一条题解
2025-07-27 21:27:55
发布于:浙江
1阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> scores(n);
int totalSum = 0;
for (int i = 0; i < n; ++i) {
cin >> scores[i];
totalSum += scores[i];
}
// 目标是尽量达到 totalSum / 2
int target = totalSum / 2;
// dp[i][j] 表示从前 i 个学生中能否选出一些使总分为 j
vector<vector<bool>> dp(n + 1, vector<bool>(target + 1, false));
dp[0][0] = true; // 前 0 个学生时,总分只能为 0
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= target; ++j) {
if (!dp[i - 1][j]) continue; // 如果不能从前 i-1 个学生中选出总分为 j,则跳过
if (j + scores[i - 1] <= target) {
dp[i][j + scores[i - 1]] = true; // 加上第 i 个学生后,可以得到总分为 j + scores[i-1]
}
dp[i][j] = true; // 不加第 i 个学生,保持总分为 j
}
}
// 找到最大的 j,使得 dp[n][j] 为 true 且 j <= target
int maxScore = 0;
for (int j = target; j >= 0; --j) {
if (dp[n][j]) {
maxScore = j;
break;
}
}
cout << maxScore << endl;
return 0;
}
这里空空如也
有帮助,赞一个