思路:对小猫的数量和车箱数进行bfs,一旦小猫的数量达到n,就统计ans的数量,如果当前车的剩余重量无法再承受任意一个猫的重量,那么我们将车辆数+1来保证小猫能够下山。
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int ans=20;
int sum[100010];
int n,m;
void dfs(int u,int k)
{
//最优剪枝法
if(k>=ans)
{
return;
}
if(u==n)
{
ans=k;
return;
}
for(int i=0;i<k;i++)
{
if(sum[i]+a[u]<=m)
{
sum[i]+=a[u];
dfs(u+1,k);
sum[i]-=a[u];
}
}
sum[k]=a[u];
dfs(u+1,k+1);
sum[k]=0;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
sort(a,a+n);
reverse(a,a+n);
dfs(0,0);
cout<<ans<<endl;
return 0;
}