许诺 • 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;
}
评论:
请先登录,才能进行评论