RT,把代码中的注释部分解注释后为啥连样例都过不了,但注释掉就能过啊?不加这个 if 数组下标难道不会访问到负数吗……还有右移负数位是smg啊?
#include <bits/stdc++.h>
#define N 100
#define M 1000
#define int1 long long
using namespace std;
int1 n, nn, W, s, i, j, k, f[N + 5][M + 5], g[N + 5][M + 5], wei[N + 5], val[N + 5], vec[N + 5][N + 5], siz[N + 5];
int1 read() {
int1 x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') {
f = -1;
}
ch = getchar();
}
while (isdigit(ch)) {
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
void print(int1 x) {
if (x < 0) {
putchar('-');
print(-x);
return ;
}
if (x >= 10) {
print(x / 10);
}
putchar(x % 10 ^ 48);
return ;
}
void ps(int1 x) {
print(x), putchar(' ');
return ;
}
void pe(int1 x) {
print(x), putchar('\n');
return ;
}
void solve() {
n = read(), nn = 5 * n, W = read();
if (n + W < 0) {
return ;
}
for (i = 1; i <= n; i++) {
wei[i] = read(), val[i] = read();
for (j = 0; !((wei[i] >> j) & 1ll); j++);
vec[j][++siz[j]] = i, wei[i] >>= j;
}
for (s = 0; W >> s; s++);
for (i = 0; i <= s; i++) {
for (j = 1; j <= siz[i]; j++) {
for (k = nn; k >= wei[vec[i][j]]; k--) {
f[i][k] = max(f[i][k], f[i][k - wei[vec[i][j]]] + val[vec[i][j]]);
}
}
}
for (i = 0; i <= s; i++) {
for (j = nn; j >= 0; j--) {
for (k = 0; k <= j; k++) {
// if (i) {
// ps(i), ps(j), pe(k);
g[i][j] = max(g[i][j], g[i - 1][((j - k) << 1) + ((W >> (i - 1)) & 1ll)] + f[i][k]);
// }
}
}
}
pe(g[s - 1][1]);
return ;
}
int main() {
while (n + W >= 0) {
memset(f, 0, sizeof(f));
memset(g, 0, sizeof(g));
memset(siz, 0, sizeof(siz));
solve();
}
return 0;
}