#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