原题链接
165. 小猫爬山 - AcWing题库https://www.acwing.com/problem/content/167/代码:
#include<iostream>
#include<algorithm>
using namespace std;
int cat[20];
int cab[20];
int ans = 0;
int n,w;
void dfs(int now,int cnt)//当前第now只小猫,已经租用了cnt辆缆车
{
if(cnt>ans)return ; //剪枝
if(now>n){ //边界条件
ans = min(ans,cnt);
return ;
}
for(int i =1;i<=cnt;i++){//看看已经租用的缆车有没有空位,有就装
if(cab[i]+cat[now]<=w){
cab[i]+=cat[now];
dfs(now+1,cnt);
cab[i] -= cat[now];
}
}
//已经租用的缆车已经没有空位了,再租一辆
cab[cnt+1] += cat[now];
dfs(now+1,cnt+1);
cab[cnt+1] = 0;
}
int main()
{
cin>>n>>w;
for(int i =1;i<=n;i++) cin>>cat[i];
sort(cat+1,cat+n+1);reverse(cat+1,cat+n+1);
ans = n;
dfs(1,0);
cout<<ans;
return 0;
}