#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> usingnamespace std; int n, half, m, g[50]; unsignedint w, ans, a[(1 << 24) + 1];
voiddfs1(int i, unsignedint sum){ if (i == half) { a[++m] = sum; return; } dfs1(i + 1, sum); if (sum + g[i] <= w) dfs1(i + 1, sum + g[i]); }
voidcalc(unsignedint val){ int rest = w - val; int l = 1, r = m; while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= rest) l = mid; else r = mid - 1; } ans = max(ans, a[l] + val); }
voiddfs2(int i, unsignedint sum){ if (i == n + 1) { calc(sum); return; } dfs2(i + 1, sum); if (sum + g[i] <= w) dfs2(i + 1, sum + g[i]); }
intmain(){ cin >> w >> n; for (int i = 1; i <= n; i++) scanf("%d", &g[i]); sort(g + 1, g + n + 1); reverse(g + 1, g + n + 1); half = n / 2 + 3; dfs1(1, 0); sort(a + 1, a + m + 1); m = unique(a + 1, a + m + 1) - (a + 1); dfs2(half, 0); cout << ans << endl; }
#include<vector> #include<iostream> #include<algorithm> usingnamespace std; int n, m; unsignedint g[50], w, ans; vector<unsignedint> a;
voiddfs1(int k, unsignedint x){ if (!k) { a.push_back(x); return; } dfs1(k - 1, x); if (x + g[k] <= w) dfs1(k - 1, x + g[k]); }
voiddfs2(int i, unsignedint x){ if (i == n + 1) { int y = *--upper_bound(a.begin(), a.end(), w - x); ans = max(ans, x + y); return; } dfs2(i + 1, x); if (x + g[i] <= w) dfs2(i + 1, x + g[i]); }
boolcmp(unsignedint x, unsignedint y){ return x > y; }
intmain(){ cin >> w >> n; for (int i = 1; i <= n; i++) cin >> g[i]; sort(g + 1, g + n + 1, cmp); int k = n / 2 + 3; dfs1(k - 1, 0); sort(a.begin(), a.end()); m = unique(a.begin(), a.end()) - a.begin(); dfs2(k, 0); cout << ans << endl; return0; }
constint N = 50; int n, w, half; int g[N]; int weight[1 << 25], idx; int ans;
voiddfs1(int now, int sum){ if (now == half) { weight[idx++] = sum; return; } // 不选当前第 now 个物品,sum 不变 dfs1(now + 1, sum); // 选当前第 now 个物品,sum + g[now] if (1ll * sum + g[now] <= w) dfs1(now + 1, sum + g[now]); }
voiddfs2(int now, int sum){ if (now == n) { int l = 0, r = idx - 1; while (l < r) { int mid = l + r + 1 >> 1; if (weight[mid] <= w - sum) l = mid; else r = mid - 1; } ans = max(weight[l] + sum, ans); return; } dfs2(now + 1, sum); if (1ll * sum + g[now] <= w) dfs2(now + 1, sum + g[now]); }
intmain(){ cin >> w >> n; for (int i = 0; i < n; ++i) cin >> g[i]; sort(g, g + n, [](int a, int b) { return a > b; }); half = n / 2 + 2;
constint N = 50; int n, w, half; int g[N]; int weight[1 << 25], idx; int ans;
intmain(){ cin >> w >> n; for (int i = 0; i < n; ++i) cin >> g[i]; sort(g, g + n, [](int a, int b) { return a > b; }); half = n / 2 + 2; for (int i = 0; i < 1 << half; ++i) { bool flag = true; longlong sum = 0; for (int j = 0; j < half; ++j) { if (i >> j & 1) sum += g[j]; if (sum > w) { flag = false; break; } } if (flag) weight[idx++] = sum; }
sort(weight, weight + idx); idx = unique(weight, weight + idx) - weight; int r = n - half; for (int i = 0; i < 1 << r; ++i) { int sum = 0; bool flag = true; for (int j = 0; j < r; ++j) { if (i >> j & 1) sum += g[j + half]; if (sum > w) { flag = false; break; } } if (flag) { int l = 0, r = idx - 1; while (l < r) { int mid = l + r + 1 >> 1; if (weight[mid] <= w - sum) l = mid; else r = mid - 1; } ans = max(weight[l] + sum, ans); } } cout << ans; }