
注意点:
- 搜索的基本思路是有效剪枝.
- 先排序一次再查找可以大大优化搜索效率.
- (167ms -> 26ms)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=1e2,INF=2e9;
int c[MAXN];//小猫重量
int w;//每辆车的最大承重
int n;//猫数量
int carWeight[MAXN];//每一辆车的当前载重量
int carCnt=0;//已使用的车数量
int ans=INF; //整体最优值
int dfs(int nowCat,int usedCnt){//当前小猫 已使用缆车量
if(nowCat>n)return usedCnt;
if(usedCnt>=ans)return INF;
int minUse=INF;//当前最小花费
carCnt++;
carWeight[carCnt]+=c[nowCat];
minUse=min(dfs(nowCat+1,usedCnt+1),minUse);//这只猫用缆车
carWeight[carCnt]-=c[nowCat];
carCnt--;
for(int i=1;i<=carCnt;i++){//这只猫不用缆车
if(carWeight[i]+c[nowCat]<=w){//能挤一挤
carWeight[i]+=c[nowCat];
minUse=min(minUse,dfs(nowCat+1,usedCnt));//挤一挤
carWeight[i]-=c[nowCat];
}
}
ans=min(ans,minUse);
return minUse;
}
bool cmp(int a,int b){
return a>b;
}
int main(){
scanf("%d%d",&n,&w);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);//读入每个猫的数量
}
sort(c+1,c+n+1,cmp);
int ans=dfs(1,0);
printf("%d\n",ans);
return 0;
}