牛客网多校 D Knapsack Cryptosystem(折半搜索)

题意:

给出一个集合,和一个数num,试求集合中的sum是否等于num,若是则输出路径(0表示没在用,1表示有在用),确保有且仅有一个正解

 

思路:

1.折半搜索

2.用map来hash,储存h[cnt]=string(表示当前半段组成的数字cnt的路径为什么),那么只需要暴力出前半个集合的所有可能性,然后搜索后半段,在收索后半段的时候,当我们当前后半段的值为ans,那么我们只需要判断hash[num-ans]是否出现即可,若是则把两边的路径合并输出即可

 

#include 
#include
#include
#include 
#include
using namespace std;
typedef long long ll;
ll n,num;

mapS; 
mapall;
ll a[101];
int index,index2;
void dfs(ll ans,string path,int cnt)
{
	if(cnt==n/2&&S[ans]==false)
	{
		S[ans]=true;
		all[ans]=path;
		return ;	
	}	
	dfs(ans+a[cnt],path+"1",cnt+1);
	dfs(ans,path+"0",cnt+1);	
}
void dfs2(ll ans,string path,int cnt)
{

	if(cnt==n)
	{	
		if(S[num-ans]==true)
		{	
		
			cout<

 

你可能感兴趣的:(2019,牛客网,多校)