这两份代码的 dp 都是一模一样的,不一样的点在于 ai,即对判断是否踩在厄运数字上的统计和的方式不同。
//WA,仅 AC #3
int main(){
int n, m, S;
n = read();
S = (1 << n) - 1;
for(int i = 1; i <= n; ++i){
a[i] = read() % Mod;
}
m = read();
for(int i = 1; i <= m; ++i){
b[i] = read() % Mod;
}
for(int i = 2; i <= S; ++i){
lg[i] = lg[i >> 1] + 1;
}
f[0] = 1;
for(int i = 1; i <= S; ++i){
int s = 0, ff = 1;
for(int j = i; j > 0; j -= lowbit(j)){
s += a[lg[lowbit(j)] + 1];
}
for(int j = 1; j <= m; ++j){
if(s == b[i]){
ff = 0;
break;
}
}
if(ff == 0) continue;;
for(int j = i; j > 0; j -= lowbit(j)){
f[i] += f[i ^ lowbit(j)];
f[i] %= Mod;
}
}
write(f[S]);
return 0;
}
//AC,题解做法
int main(){
int n, m, S;
n = read();
S = (1 << n) - 1;
for(int i = 1; i <= n; ++i){
a[1 << i - 1] = read() % Mod;
}
m = read();
for(int i = 1; i <= m; ++i){
b[i] = read() % Mod;
}
f[0] = 1;
for(int i = 1; i <= S; ++i){
a[i] = a[i ^ lowbit(i)] + a[lowbit(i)];
if(a[i] == b[1] || a[i] == b[2]) continue;
for(int j = i; j > 0; j -= lowbit(j)){
f[i] += f[i ^ lowbit(j)];
f[i] %= Mod;
}
}
write(f[S]);
return 0;
}