#include <bits/stdc++.h>
#define int_max 0x3f3f3f3f;
#define long_max 9223372036854775807;
using namespace std;
using VI = vector<int>;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ull;
const int mod = 1e9 + 7;
int n;
int m;
int x = -1,y = -1;
int lowbit(int t){
return t & -t;
}
int dp[1<<24];
int dis[1<<24];
int main() {
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&dis[1<<i]);
cin>>m;
if(m == 1){
cin>>x;
}else if(m == 2){
cin>>x>>y;
}else{
x = -1,y = -1;
}
dp[0] = 1;
for(int i=1;i<(1<<n);++i){
dis[i] = dis[i ^ lowbit(i)] + dis[lowbit(i)];
if(dis[i] == x || dis[i] == y){
dp[i] = 0;
continue;
}
for(int j = i ,k = lowbit(j);j;j ^= k,k = lowbit(j)){
dp[i] += dp[i ^ k];
if(dp[i] >= mod) dp[i] -= mod;
}
}
printf("%d",dp[(1<<n)-1]);
}
只能说很无语的一道题,分要卡枚举每一位。
所以只能改成每次枚举从最低为开始用lowbit找1 挺无语