解法一:枚举所有可能的三个数的组合,求出它们的和,如果和不超过M,更新最大总和。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> nums(N);
    for (int i = 0; i < N; i++) {
        cin >> nums[i];
    }
    int maxSum = 0;
    for (int i = 0; i < N-2; i++) {
        for (int j = i+1; j < N-1; j++) {
            for (int k = j+1; k < N; k++) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum <= M) {
                    maxSum = max(maxSum, sum);
                }
            }
        }
    }
    cout << maxSum << endl;
    return 0;
}

解法二:先对数组进行排序,然后从数组的最大值开始枚举,假设最大值为x,那么剩下的两个数的和不超过M-x,找到最接近M-x的两个数的和,然后和x的和就是当前的最大总和。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int N, M;
    cin >> N >> M;
    vector<int> nums(N);
    for (int i = 0; i < N; i++) {
        cin >> nums[i];
    }
    sort(nums.begin(), nums.end());
    int maxSum = 0;
    for (int i = N-1; i >= 2; i--) {
        int target = M - nums[i];
        int left = 0, right = i-1;
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum <= target) {
                maxSum = max(maxSum, sum + nums[i]);
                left++;
            } else {
                right--;
            }
        }
    }
    cout << maxSum << endl;
    return 0;
}
``

原文地址: https://www.cveoy.top/t/topic/ixSW 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录