原题链接:Acwing 165. 小猫爬山
学习博客:[dfs] aw165. 小猫爬山(dfs剪枝与优化+好题)
#include <bits/stdc++.h>
using namespace std;
#define ull unsigned long long
int n,m;
int w[20];
int car[20];
int res=1e8;
void dfs(int u,int cnt)
{
if(cnt>=res)
return ;
if(u==n)
{
res=min(res,cnt);
return ;
}
for(int i=0;i<cnt;i++)
{
if(car[i]+w[u]<=m)
{
car[i]+=w[u];
dfs(u+1,cnt);
car[i]-=w[u];
}
}
car[cnt]+=w[u];
dfs(u+1,cnt+1);
car[cnt]-=w[u];
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>w[i];
}
sort(w,w+n);
reverse(w,w+n);
dfs(0,0);
cout<<res<<endl;
return 0;
}