题目链接:活动 - AcWing
标签: dfs
思路:对每只小猫都做两种选择:
1、从1~cnt辆车中,选择一辆将它放进去不会超重的车放进去;
2、新开一辆车将它放进去。
剪枝:
1、如果当前开的车比最优解多了 return;
2、将小猫从大到小排序,先放重量大的。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 20;
int num[N];
bool vis[N];
int ans=N;
int n,w;
int c[N],sum[N];
void dfs(int u,int cnt)
{
if(cnt>ans) return;
else if(u>n)
{
ans=min(ans,cnt);
return;
}
//选择放到已有缆车上
for(int i=1;i<=cnt;i++)
{
if(sum[i]+c[u]<=w)
{
sum[i]+=c[u];
dfs(u+1,cnt);
sum[i]-=c[u];
}
}
//选择新开一辆缆车
sum[cnt+1]=c[u];
dfs(u+1,cnt+1);
}
int main()
{
cin>>n>>w;
for(int i=1;i<=n;i++) cin>>c[i];
sort(c+1,c+n+1,greater<int>());
dfs(1,0);
cout<<ans<<endl;
return 0;
}