![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/32edb5f4f456db9f86ecad23c7b6b300.png)
- f[i][j][k] 表示前i个物品,异或和为j,体积为k,的方案是否存在
- 异或有逆向性质,a ^ b ^ b = a;
- f[i][j][k] = f[i - 1][j ^ w[i]][k - v[i]] | f[i - 1][j][k]
- 滚动优化空间,f[j][k] = f[j ^ w[i]][k - v[i]] | f[j][k]
- 也就是f[j][k] |= f[j ^ w[i]][k - v[i]]
- 由于体积有10^3,用bitset压缩体积的状态进行优化,f[j]表示异或和为j,其中它的每一位k表示体积为k,方案是否存在;且体积这维用的是减法,可以转化为bitset的左移
#include <iostream>
#include <bitset>
using namespace std;
const int N = 1e3 + 80;
int n, m;
int v[N], w[N];
bitset<N> f[N], g[N];
int main() {
int _; cin >> _;
while (_ -- ) {
cin >> n >> m;
for (int i = 1; i <= n; ++ i) {
cin >> v[i] >> w[i];
}
f[0][0] = 1;
for (int i = 1; i <= n; ++ i) {
for (int j = 0; j < 1024; ++ j) {
g[j] = f[j];
g[j] <<= v[i];
}
for (int j = 0; j < 1024; ++ j) {
f[j] |= g[j ^ w[i]];
}
}
int ans = -1;
for (int i = 1023; i >= 0; -- i) {
if (f[i][m]) {
ans = i;
break;
}
}
cout << ans << endl;
for (int i = 0; i < 1024; ++ i) {
f[i].reset();
}
}
}