思路:使用深度优先搜索,对于每一只小猫枚举每一台缆车,如果当前缆车可以装下就dfs进去搜索,又或者是新开一辆缆车去装。
优化1:答案最大就是小猫的数量,一开始ans初始化为n,如果在dfs时缆车的数量已经大于等于已经更新好的ans就直接返回。
优化2:对比重量小的小猫,重量大的小猫明显更难找。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int cat[20];
int w[20],cnt;
int m,n;
int ans;
void dfs(int u,int sum)
{
if(sum>=ans) return ;
if(u==n+1)
{
ans=min(ans,sum);
return ;
}
for(int i=1;i<=sum;i++)
{
if(cat[i]+w[u]<=m)
{
cat[i]+=w[u];
dfs(u+1,sum);
cat[i]-=w[u];
}
}
cat[sum +1]=w[u];
dfs(u+1,sum+1);
cat[u+1]=0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
sort(w+1,w+n+1);
reverse(w+1,w+n+1);
ans=n;
dfs(1,0);
cout<<ans;
return 0;
}