萌新刚学折半搜索,96ptsTLE 求助
查看原帖
萌新刚学折半搜索,96ptsTLE 求助
776582
jhdrgfj楼主2023/7/21 12:32

剪枝剪了一个小时,剪不动了,就超了 130ms

#include<bits/stdc++.h>
using namespace std;
int a[35],need,n,ans=114514,clo=0;
unordered_map <int,int> m,m2;
unordered_map <int,bool> vis,vis2;
void dfs(int cnt,int id,int v)
{
	if (v>need || (vis[v] && m[v]<cnt) || cnt>ans){
		return ;
	}
	if (v==need){
	    ans=min(ans,cnt);
	    return ;
	}
	m[v]=min(m[v],cnt);
	if (id==n/2+1){	
	    if (!vis[v]){
	        vis[v]=1;
		    m[v]=cnt;
	    }
		return ;
	}
	dfs(cnt,id+1,v);
	dfs(cnt,id+1,v+a[id]);
	dfs(cnt+1,id+1,v+a[id]/2);
}
void dfs2(int cnt,int id,int v){
    if (cnt>ans || v>need){
		return ;
	}
	if (v==need){
	    ans=min(ans,cnt);
	    return ;
	}	
	if (id==n+1){	
		if (vis[need-v]){
    		ans=min(ans,m[need-v]+cnt);	
    	}
		return ;
	}
	dfs2(cnt,id+1,v);
	dfs2(cnt,id+1,v+a[id]);
	dfs2(cnt+1,id+1,v+a[id]/2);
}
int main()
{
    ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>need;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		a[i]*=2;
	}
	need*=2;
	sort(a+1,a+n+1);
	dfs(0,0,0);
	dfs2(0,n/2+1,0);
	cout<<(ans==114514?-1:ans);
}
2023/7/21 12:32
加载中...