WA on #4 #7,TLE on #19 #23 #24 QAQ
#include<iostream>
#include<unordered_map>
#include<algorithm>
#define int long long
using namespace std;
int n,m,tot,a[40],sum[40],ans=0x3f3f3f3f,t;
unordered_map<int,int> ma;
int read(){
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-'){
f=-1;
}
c=getchar();
}
while(c>='0'&&c<='9'){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
void dfs1(int idx,int now,int res){
if(now>m||ans<res){
return;
}
if(now==m){
ans=min(ans,res);
return;
}
if(idx>t){
if(now<=m){
if(!ma[now]){
ma[now]=res;
}
else ma[now]=min(ma[now],res);
}
return;
}
dfs1(idx+1,now+a[idx],res+1);
dfs1(idx+1,now+2*a[idx],res);
dfs1(idx+1,now,res);
}
void dfs2(int idx,int now,int res){
if(now>m||ans<res){
return;
}
if(now==m){
ans=min(ans,res);
return;
}
if(idx>n){
if(now<=m&&ma[m-now]){
ans=min(ans,ma[m-now]+res);
}
return;
}
dfs2(idx+1,now+a[idx],res+1);
dfs2(idx+1,now+2*a[idx],res);
dfs2(idx+1,now,res);
}
bool cmp(int a,int b){
return a>b;
}
signed main(){
n=read();
m=read();
m*=2;
t=n/2;
for(int i=1;i<=n;i++){
a[i]=read();
}
sort(a+1,a+n+1,cmp);
dfs1(1,0,0);
dfs2(t+1,0,0);
printf("%lld",ans==0x3f3f3f3f?-1:ans);
return 0;
}