AC

许诺  •  20小时前


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

using namespace std;

typedef long long ll;

struct Item {

ll weight;
ll value;

};

vector items; vector generateCombinations(int start, int end) {

vector<Item> res;
int n = end - start + 1;
for (int mask = 0; mask < (1 << n); mask++) {
    ll totalWeight = 0, totalValue = 0;
    for (int i = 0; i < n; i++) {
        if (mask >> i & 1) {
            totalWeight += items[start + i].weight;
            totalValue += items[start + i].value;
        }
    }
    res.push_back({totalWeight, totalValue});
}
return res;

}

int main() {

int N;
ll C;
cin >> N >> C;
items.resize(N);
for (int i = 0; i < N; i++) {
    cin >> items[i].value >> items[i].weight;
}
vector<Item> group1 = generateCombinations(0, N/2 - 1);
vector<Item> group2 = generateCombinations(N/2, N-1);
sort(group2.begin(), group2.end(), [](const Item& a, const Item& b) {
    return a.weight < b.weight;
});
for (size_t i = 1; i < group2.size(); i++) {
    group2[i].value = max(group2[i].value, group2[i-1].value);
}

ll ans = 0;
for (const Item& g1 : group1) {
    if (g1.weight > C) continue;

    ll remaining = C - g1.weight;
    int left = 0, right = group2.size() - 1;
    int pos = -1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (group2[mid].weight <= remaining) {
            pos = mid;
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    if (pos != -1) {
        ans = max(ans, g1.value + group2[pos].value);
    } else {
        ans = max(ans, g1.value);
    }
}

cout << ans << endl;

return 0;

}


评论:

请先登录,才能进行评论