92分求调
查看原帖
92分求调
754444
tamamocross楼主2023/5/13 16:58
#include<iostream> 
#include<unordered_map>
#include<algorithm>
const int INF=0x7fffffff;
using namespace std;
int N,sum;
int ans=INF;
struct ele{
	int n;
	ele(int n_=INF){
		n=n_;
	}
	friend bool operator <(ele a,ele b){
		return a.n<b.n;
	}
};
unordered_map <long long,ele> mp;
int melon[31];
void search_l(int start,int end,long long n,int f){
	//cout<<start<<" "<<melon[start]<<" "<<n<<" "<<f<<endl;
	if(n>sum){
		return;
	}
	if(start!=end+1){
		search_l(start+1,end,n,f);
		search_l(start+1,end,n+melon[start],f+1);
		search_l(start+1,end,n+2*melon[start],f);
	}else{
		ele tmp(f);
		mp[n]=min(mp[n],tmp);
		return;
	}
}
void search_r(long long start,int end,long long n,int f){
	if(n>sum){
		return;
	}
	if(start!=end&&f<=ans){
		search_r(start-1,end,n,f);
		search_r(start-1,end,n+melon[start],f+1);
		search_r(start-1,end,n+2*melon[start],f);
	}else{
		if(mp[sum-n].n!=INF){
			ans=min(mp[sum-n].n+f,ans);
		}
	}
	return;
}


int main(){
	ios::sync_with_stdio(0);
	cin>>N>>sum;
	for(int i=1;i<=N;i++){
		cin>>melon[i];
	}
	sort(melon+1,melon+1+N);
	int mid=N/2;
	sum*=2;
	search_l(1,mid,0,0);
	search_r(N,mid,0,0);
	if(ans!=INF){
		cout<<ans;
	}else{
		cout<<-1;
	}
}//右边搜索时不要搜到左边了 

本人确实想不到该怎么优化了,有无佬帮忙看看qaq

2023/5/13 16:58
加载中...