1.后缀和剪枝
2.排序大数在前剪枝
3.枚举3种情况
cpp
#include<bits/stdc++.h>
using namespace std;
const int N=2005;
typedef long long ll;
const double MAX=1e10;
int n,m;
double a[32];
double s[32];
int mi=-1;
int c=0;
void dfs(double w,int d,int x)
{
if(w==m)
{
if(!c) mi=d,c++;
else mi=min(d,mi);
}
if(w+s[x+1]<m) return;
if(w>m) return;
if(x>n) return;
dfs(w+a[x+1],d,x+1);
dfs(w,d,x+1);
dfs(w+a[x+1]/2,d+1,x+1);
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n,greater<double>());
for(int i=n-1;i>=0;i--) s[i]=s[i+1]+a[i];
dfs(a[0],0,0);
dfs(0,0,0);
dfs(a[0]/2,1,0);
cout<<mi;
return 0;
}