双向搜索

发布时间 2023-06-28 17:02:12作者: AC7

应用

起点和终点是已知的,需要确定从起点到终点需要多少步

P4799 [CEOI2015 Day2] 世界冰球锦标赛

此题不需要去重

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
ll m,a[50],ans;
int p;
 
ll ans1[1<<21],idx1,ans2[1<<21],idx2;

void dfs1(int k,ll sum)
{
	if(sum > m)return;
	if(k > p)
	{
		ans1[++idx1] = sum;
		return;
	}
	dfs1(k+1,sum+a[k]);
	dfs1(k+1,sum);
}

void dfs2(int k,ll sum)
{
	if(sum > m)return;
	if(k > n)
	{
		ans2[++idx2] = sum;
		return;
	}
	dfs2(k+1,sum+a[k]);
	dfs2(k+1,sum);
}


int main()
{
	scanf("%d%lld",&n,&m);
	for(int i = 1;i<= n;i++)scanf("%lld",a+i);
	p = n/2;
	dfs1(1,0);
	dfs2(p+1,0);
	
	sort(ans1+1,ans1+1+idx1);
	sort(ans2+1,ans2+1+idx2);

	int p2 = idx2;
	for(int i = 1;i <= idx1;i++)
	{
		while(ans2[p2] + ans1[i] > m)p2--;
		ans += p2;
	}
	
	printf("%lld",ans);
	
	
	return 0;
}