蒟蒻WA两个点,求调
查看原帖
蒟蒻WA两个点,求调
1211185
2024Ghost楼主2024/5/4 11:35
#include<bits/stdc++.h>
#include<unordered_map>
typedef long long ll;
using namespace std;
ll n,mm,nn,ans;
ll a[40];
unordered_map<ll,ll>mp;
void dfs(int x,ll m,ll c){
	if(m>mm||(mp.count(m)&&mp[m]<c))return;
	if(m==mm){
		ans=min(ans,c);
		return; 
	}
	if(x>nn&&m<=mm){
		if(mp.count(m)){
			mp[m]=min(mp[m],c);
		}
		else mp[m]=c;
		return;
	}
	dfs(x+1,m,c);
	dfs(x+1,m+a[x],c+1);
	dfs(x+1,m+(a[x]<<1),c);
	return;
}
void dfsfan(int x,ll m,ll c){
	if(m>mm)return;
	if(c>ans)return;
	if(m==mm){
		ans=min(ans,c);
		return; 
	}
	if(x>n){
    	if(mp.count(mm-m)&&m<=mm){
    		ans=min(mp[mm-m]+c,ans);	
		}
		return;
	}

	dfsfan(x+1,m,c);
	dfsfan(x+1,m+a[x],c+1);
	dfsfan(x+1,m+(a[x]<<1),c);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
    cin>>n>>mm;
    ans=114514114514;
    mm=(mm<<1);
    for(ll i=1;i<=n;i++){
    	cin>>a[i];
	}
	nn=n/2+1;
	sort(a+1,a+n+1);
	dfs(1,0,0);
	dfsfan(nn,0,0);
	if(ans==114514114514)cout<<-1;
	else cout<<ans;
	return 0;
}

RT

2024/5/4 11:35
加载中...