U56447 小猫爬山
#include <bits/stdc++.h>
using namespace std;
int n,aas=2e9,w,a[30];
bool vis[30];
void dfs(int r,int i,int num,int o){
vis[i]=1;
o++;
r-=a[i];
if(r<0){
r+=a[i];
for(int j=1;j<=n;j++){
if(r>=a[j]&&!vis[j]){
vis[i]=0;
return;
}
}
r=w-a[i];
num++;
}
if(num>aas) return;
if(o>=n){
vis[i]=0;
aas=min(aas,num);
return;
}
for(int j=n;j>=1;j--){
if(vis[j]) continue;
dfs(r,j,num,o);
}
vis[i]=0;
return;
}
int main(){
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+1+n);
dfs(w,n,1,0);
printf("%d",aas);
return 0;
}