求助状压dp TLE+RE
查看原帖
求助状压dp TLE+RE
1074583
_Revali_楼主2024/10/10 08:55

记录

#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int MOD = 1e9 + 7;
int n, m, a[25];
ll dp[17000000], s[17000000];
bool f[17000000];
unordered_map<int, bool> mp;
int main(){
	cin >> n;
	for(int i = 1; i <= n; i++) cin >> a[i];
	cin >> m;
	while(m--){
		int x;
		cin >> x;
		mp[x] = 1;
	}
	int mx = (1 << n) - 1;
	dp[0] = 1;
	for(int i = 1; i <= mx; i++){
		for(int j = 1; j <= n; j++){
			if((1 << (j - 1)) & i){
				s[i] = s[i ^ (1 << (j - 1))] + a[j];
				if(mp[s[i]]) f[s[i]] = 1;
				if(f[s[i ^ (1 << (j - 1))]]) continue;
				dp[i] += dp[i ^ (1 << (j - 1))];
				if(dp[i] >= MOD) dp[i] -= MOD;
			}
		}
	}
	cout << dp[mx];
	return 0;
}
2024/10/10 08:55
加载中...