题解:本题是按车来搜索,前面cars辆车能否将cats只猫装完,不行就多一辆车,接着搜
#include <iostream>
#include <algorithm>
using namespace std;
int cmp(int a,int b){return a>b;}
bool visit[20]={false};
int weight ,n,w[20],sum[20],ans;///sum[i]第i辆车当前载重
void dfs(int cats,int cars)///小猫的数量,车的数量
{
if(cars>=ans) return ;///剪枝,车数大于当前的最佳答案数,返回
if(cats==n+1) {ans=min(ans,cars);return;}///递归边界,所有猫都装完了,更新答案
for(int i=1;i<=cars;i++)///在当前使用的cars辆车当中搜索
{
if(w[cats]+sum[i]<=weight)///如果第cats只小猫能上第i辆车
{
sum[i]+=w[cats];///车放上猫
dfs(cats+1,cars);///向猫数加一搜索
sum[i]-=w[cats];///状态恢复,不放这只猫
}
}
///当没有车或者前面cars辆车搜索完时,换一辆车,载一只猫,往下搜索
sum[cars+1]=w[cats];
dfs(cats+1,cars+1);
sum[cars+1]=0;///状态恢复
}
int main()
{
cin>>n>>weight;
for(int i=1;i<=n;i++) cin>>w[i];
sort(w+1,w+n+1,cmp);///从重的猫先上车,可以提高dfs效率
ans=n;
dfs(1,0);
cout << ans << endl;
return 0;
}