//80%足够了
#include<bits/stdc++.h>
using namespace std;
int n;
double m;
int w[100];
long long sw[50];
int ans=1e9+10;
void dfs(int u, int k, double s){//当前枚举位置,已切数量,剩余重量
if(s>sw[u])return ;
if(s==sw[u]){
ans=min(k,ans);
return ;
}
if(u>n)return ;
if(k>=ans)return ;//最优性剪枝
if(s==0){
ans=min(k,ans);
return ;
}
for(int i=u;i<n;i++){
if(s-w[i]>=0)dfs(i+1,k,s-w[i]);
double dw=w[i]/2.0;
if(s-dw>=0)dfs(i+1,k+1,s-dw);
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)cin>>w[i];
sort(w,w+n);
reverse(w,w+n);//搜索顺序优化剪枝
// for(int i=0;i<n;i++)cout<<w[i]<<endl;
// cout<<382920<<endl;
sw[n-1]=w[n-1];
for(int i=n-2;i>=0;i--){
//cout<<i+1<<" "<<sw[i+1]<<endl;
sw[i]=sw[i+1]+w[i];
//cout<<sw[i+1]<<endl;
}
//for(int i=0;i<n;i++)cout<<sw[i]<<endl;
dfs(0,0,m);
if(ans==1e9+10)cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}
//不知道为什么出问题了
//同提高课送礼物171
#include<bits/stdc++.h>
using namespace std;
int n;
long long m;
long long w[100];
long long sw[100];
int st[100];
int cnt,cnt2;
int ans=1e9+10;
int p;
int flag;
unordered_map<long long,int> ma;
void dfs1(int u,int k,long long s){//预处理
if(s>m)return ;
if(flag==1 and ans==0)return ;
if(s==m){
ans=min(ans,k);
if(k==0){
flag=1;
return ;
}
}
if(u==p){
int tt=(ma[s]==0 ? 1e9: ma[s]);
ma[s]=min(tt,k);//贪心:等量的配重要切的最少
sw[cnt++]=s;
return ;
}
//不选u
dfs1(u+1,k,s);
//选u
if(s+w[u]<=m)dfs1(u+1,k,s+w[u]);
//选1/2u
if(s+w[u]/2<=m)dfs1(u+1,k+1,s+w[u]/2);
}
int ttt=0;
void dfs(int u, int k, long long s){//当前枚举位置,已切数量,当前总重量
if(u>n)return ;
if(k>=ans){
return ;//最优性剪枝
}
if(s>m)return ;
if(u==n){
//cout<<999999<<endl;
int l=0,r=cnt2;
while(l<r){
int mid=l+r>>1;
if(s+sw[mid]<=m)l=mid+1;
else r=mid;
}
//cout<<382093<<endl;
if(s+sw[l]!=m)return ;
// cout<<382093<<endl;
ans=min(ans,k+ma[sw[l]]);
return ;
}
//不选u
dfs(u+1,k,s);
//选u
if(s+w[u]<=m)dfs(u+1,k,s+w[u]);
//选1/2u
if(s+w[u]/2<=m)dfs(u+1,k+1,s+w[u]/2);
return ;
}
int main()
{
cin>>n>>m;
m=m*2;
for(int i=0;i<n;i++){
int x;
cin>>x;
w[i]=x*2;
}
sort(w,w+n);
reverse(w,w+n);//搜索顺序优化剪枝
p=n/2;
dfs1(0,0,0);//前1/2的瓜能凑出的质量
//排序
sort(sw,sw+cnt);
//去重
for(int i=1;i<cnt;i++){
if(sw[i]!=sw[i-1])sw[cnt2++]=sw[i];
}
if(ans==0){
cout<<0<<endl;
return 0;
}
dfs(p,0,0);
if(ans==1e9+10)cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}