- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N = 50;
- const long long INF = 0x3fffffff;
- typedef long long LL;
- int n;
- LL w[N], v[N];
- LL W;
- pair <LL, LL> pi[1 << (N / 2)];
- void solve() {
- int n2 = n / 2;
- for(int i = 0; i < (1 << n2); i++) {
- LL sw = 0, sv = 0;
- for(int j = 0; j < n2; j++) {
- if((i >> j) & 1) {
- sw += w[j];
- sv += v[j];
- }
- }
- pi[i] = make_pair(sw, sv);
- }
- sort(pi, pi + (1 << n2));
- int m = 1;
- for(int i = 1; i < (1 << n2); i++) {
- if(pi[m-1].second < pi[i].second) {
- pi[m++] = pi[i];
- }
- }
- LL res = 0;
- for(int i = 0; i < (1 << (n - n2)); i++) {
- LL sw = 0, sv = 0;
- for(int j = 0; j < n - n2; j++) {
- if((i >> j) & 1) {
- sw += w[n2 + j];
- sv += v[n2 + j];
- }
- }
- if(sw <= W) {
- LL tv = (lower_bound(pi, pi + m, make_pair(W - sw, INF)) - 1)->second;
- res = max(res, sv + tv);
- }
- }
- printf("%lld\n", res);
- }
- int main() {
- while(~scanf("%d%lld", &n, &W)) {
- for(int i = 0; i < n; i++) {
- scanf("%lld%lld", &w[i], &v[i]);
- }
- solve();
- }
- return 0;
- }
超大01背包问题(二分)
最新推荐文章于 2022-07-28 15:05:06 发布