原题链接:https://www.acwing.com/problem/content/167/
//经典dfs() 模板=(状态,变化参数) + if(问题边界) + if(剪枝) + 枚举搜索下一个状态 + 回溯
//本题解析:
//dfs(u,k) u:搜索到小猫的个数 k:当前车的数量为k
//cat数组: 下标从1开始 car[i]为第i只小猫的重量
//car数组:下标从0开始 有k辆车 则前k辆车的下标为0 - k-1 第k+1辆车的下标为k
//边界:1、当小猫的个数为9时则return 2、if(k>=res) return;
//关键部分:dfs第i个小猫放在前k辆车上和放在新的一辆车上
//回溯:没dfs一次 需要清理现场
#include <iostream>
#include <algorithm>
using namespace std;
const int N=20;
int n,W;
int car[N],cat[N];
int res=N;
void dfs(int u,int k){
if(k>=res) return;
if(u==n+1){
res=k;
return;
}
for(int i=0;i<k;i++)
{
if(car[i]+cat[u]<=W){
car[i]+=cat[u];
dfs(u+1,k);
car[i]-=cat[u];
}
}
car[k]=cat[u];
dfs(u+1,k+1);
car[k]=0;
}
int main(){
cin>>n>>W;
for(int i=1;i<=n;i++) cin>>cat[i];
sort(cat+1,cat+n+1,greater<int>());
dfs(1,0);
cout<<res;
return 0;
}