Circuit Counting---------------------------------思維(dfs)

在這裏插入圖片描述
在這裏插入圖片描述
題意:
給定n個向量,任選向量使其相加和爲0的方案數

解析:
n的範圍非常小,爆搜240會超時,我們可以優化
我們一半一半的搜 時間複雜度就優化成 2*220

前一半搜索我們標記一下哪些數的出現,後一半搜索就計算貢獻

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
int n,m;
const int N=1100;
typedef long long ll;
typedef pair<int,int> PII;
PII q[N];
ll vis[N][N];
ll ans;
void dfs(int u,int x,int y)
{
	if(u==m+1)
	{
		vis[x+500][y+500]++;
		return ;
	}
	dfs(u+1,x,y);
	dfs(u+1,x+q[u].x,y+q[u].y);
	return ;
}
void dfs1(int u,int x,int y)
{
	if(u==n+1)
	{
		ans+=(ll)vis[500-x][500-y];
		return ;
	}
	dfs1(u+1,x,y);
	dfs1(u+1,x+q[u].x,y+q[u].y);
	return ;
}
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) cin>>q[i].x>>q[i].y;
	m=n/2;
	dfs(1,0,0);
	dfs1(m+1,0,0); 
	cout<<ans-1<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章