过了,但还是有疑问
查看原帖
过了,但还是有疑问
510555
ImposterAnYu楼主2023/10/11 11:31

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;
}
2023/10/11 11:31
加载中...