这道题,首先第一思路可能是把所有情况列出来,但一定会超时的,到最后会有2的2048次方的情况,我们1来看数据范围,bi小于等于2048,那么这些所有的情况一定是小于2048的,所以可以开一个2048的数组,把所以出现过的数字记录,另外要注意最近的一组数据要覆盖住旧的出现过的数字

#include <iostream>
#include <bitset>
#include <vector>
using namespace std;

const int MAXV = 2048;

int main() {
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < n; ++i) cin >> b[i];

    bitset<MAXV> dp;   // 当前可能的值
    dp[0] = 1;         // 初始只有0

    for (int i = 0; i < n; ++i) {
        bitset<MAXV> ndp;   // 下一步可能的值
        for (int x = 0; x < MAXV; ++x) {
            if (dp[x]) {
                // 规则一:减法
                int v1 = max(0, x - a[i]);
                ndp[v1] = 1;
                // 规则二:异或
                int v2 = x ^ b[i];
                ndp[v2] = 1;
            }
        }
        dp = ndp;   // 滚动更新
    }

    // 从大到小找最大值
    for (int ans = MAXV - 1; ans >= 0; --ans) {
        if (dp[ans]) {
            cout << ans << endl;
            break;
        }
    }
    return 0;
}

推荐使用bitset