1 条题解

  • 1
    @ 2026-4-12 19:48:30

    #include #include #include #include using namespace std;

    int main() { int W, N; cin >> W >> N; vector G(N); for (int i = 0; i < N; ++i) { cin >> G[i]; }

    // 折半:前半部分和后半部分
    int mid = N / 2;
    vector<long long> left_sums, right_sums;
    
    // 枚举前半部分所有子集
    for (int mask = 0; mask < (1 << mid); ++mask) {
        long long sum = 0;
        for (int i = 0; i < mid; ++i) {
            if (mask & (1 << i)) {
                sum += G[i];
            }
        }
        if (sum <= W) left_sums.push_back(sum);
    }
    
    // 枚举后半部分所有子集
    for (int mask = 0; mask < (1 << (N - mid)); ++mask) {
        long long sum = 0;
        for (int i = mid; i < N; ++i) {
            if (mask & (1 << (i - mid))) {
                sum += G[i];
            }
        }
        if (sum <= W) right_sums.push_back(sum);
    }
    
    // 对右半部分排序,便于二分查找
    sort(right_sums.begin(), right_sums.end());
    
    long long max_weight = 0;
    for (long long left_sum : left_sums) {
        long long remaining = W - left_sum;
        // 在 right_sums 中找不超过 remaining 的最大值
        auto it = upper_bound(right_sums.begin(), right_sums.end(), remaining);
        if (it != right_sums.begin()) {
            --it;
            max_weight = max(max_weight, left_sum + *it);
        }
    }
    
    cout << max_weight << endl;
    return 0;
    

    }

  • 1

信息

ID
82
时间
1000ms
内存
128MiB
难度
9
标签
递交数
33
已通过
3
上传者