救人
2026-10-17 14:26:17
发布于:浙江
#include<bits/stdc++.h>
#include <unordered_map>
using namespace std;
int n,m,mid;
using U=unsigned long long;
U ALL_ON;
vector<U> eff;
unordered_map<U,int> best;
int ans=INT_MAX;
void left(int i,int end,U mask,int cnt){
if(i==end){
auto it=best.find(mask);
if(it==best.end()) best[mask]=cnt;
else it->second=min(it->second,cnt);
return;
}
left(i+1,end,mask,cnt);
left(i+1,end,mask^eff[i],cnt+1);
}void right(int i,U mask,int cnt){
if(i==n){
U need=ALL_ON^mask;
auto it=best.find(need);
if(it!=best.end()){
ans=min(ans,it->second+cnt);
}
return;
}
right(i+1,mask,cnt);
right(i+1,mask^eff[i],cnt+1);
}
int main(){
cin>>n>>m;
eff.assign(n,0);
for(int i=0;i<n;i++){
eff[i]|=1ULL<<i;
}
for(int i=0;i<m;i++){
int u,v;
cin>>u>>v;
u--,v--;
eff[u]|=1ULL<<v;
eff[v]|=1ULL<<u;
}
ALL_ON=(1ULL<<n)-1;
mid=n/2;
best.reserve((1ULL<<mid)*2);
left(0,mid,0,0);right(mid,0,0);
cout<<ans<<'\n';
return 0;
}
全部评论 1
#include<bits/stdc++.h> using namespace std; int n, mid; long long a[25]; map<long long, vector<int>> left_map; vector<bool> good; void genleft(int i, int end, long long diff, int mask) { if (i == end) { left_map[diff].push_back(mask); return; } genleft(i + 1, end, diff, mask); genleft(i + 1, end, diff + a[i], mask | (1 << i)); genleft(i + 1, end, diff - a[i], mask | (1 << i)); } void genright(int i, long long diff, int mask) { if (i == n) { if (left_map.count(-diff)) { vector<int>& candidates = left_map[-diff]; for (int j = 0; j < (int)candidates.size(); j++) { good[candidates[j] | mask] = true; } } return; } genright(i + 1, diff, mask); genright(i + 1, diff + a[i], mask | (1 << i)); genright(i + 1, diff - a[i], mask | (1 << i)); } int main() { cin >> n; for (int i = 0; i < n; i++) { cin >> a[i]; } mid = n / 2; good.assign(1 << n, false); genleft(0, mid, 0, 0); genright(mid, 0, 0); int ans = 0; for (int i = 1; i < (1 << n); i++) { if (good[i]) ans++; } cout << ans << endl; return 0; }9小时前 来自 浙江
0



















有帮助,赞一个