剪枝剪了一个小时,剪不动了,就超了 130ms
#include<bits/stdc++.h>
using namespace std;
int a[35],need,n,ans=114514,clo=0;
unordered_map <int,int> m,m2;
unordered_map <int,bool> vis,vis2;
void dfs(int cnt,int id,int v)
{
if (v>need || (vis[v] && m[v]<cnt) || cnt>ans){
return ;
}
if (v==need){
ans=min(ans,cnt);
return ;
}
m[v]=min(m[v],cnt);
if (id==n/2+1){
if (!vis[v]){
vis[v]=1;
m[v]=cnt;
}
return ;
}
dfs(cnt,id+1,v);
dfs(cnt,id+1,v+a[id]);
dfs(cnt+1,id+1,v+a[id]/2);
}
void dfs2(int cnt,int id,int v){
if (cnt>ans || v>need){
return ;
}
if (v==need){
ans=min(ans,cnt);
return ;
}
if (id==n+1){
if (vis[need-v]){
ans=min(ans,m[need-v]+cnt);
}
return ;
}
dfs2(cnt,id+1,v);
dfs2(cnt,id+1,v+a[id]);
dfs2(cnt+1,id+1,v+a[id]/2);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>need;
for (int i=1;i<=n;i++){
cin>>a[i];
a[i]*=2;
}
need*=2;
sort(a+1,a+n+1);
dfs(0,0,0);
dfs2(0,n/2+1,0);
cout<<(ans==114514?-1:ans);
}