可以类似背包用 Bitset 做到 $O(\frac{nV}{\omega})$。

当然对于表达式问题变形加桶是更常用的方法:

$$
a_x + a_y + a_z = a_i \iff a_x + a_y = a_i - a_z
$$

可以用 unordered_map 在 $O(n^2)$ 内完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5;
int n;
bitset<maxn*2+5> bs[5];
int ans;
signed main(){
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int x;
scanf("%d",&n);
bs[0][maxn]=1;
for(int i=1;i<=n;i++){
scanf("%d",&x);
if(bs[3][x+maxn]) ans++;
for(int j=0;j<=2;j++){
if(x>0) bs[j+1]|=bs[j]<<x;
else bs[j+1]|=bs[j]>>(-x);
}
}
printf("%d",ans);
return 0;
}