注意点:
- 搜索的基本思路是有效剪枝.
- 先排序一次再查找可以大大优化搜索效率.
- (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; }