DFS
可以看这个博客DFS(算法简介+例题讲解)_dfs算法题-CSDN博客
小猫爬山
思路
从大到小排序
贪心:先装大的,小的可以插进去,更优
剪枝
当需要放时,遍历装好的车,是否能插入,不行就新开一辆,可以就递归继续判断。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_s[tdio(0),cin.tie(0),cout.tie(0);
int c[20],cab[20],n,w,ans;
void dfs(int now,int cnt)
{
if(cnt>=ans) return;//需要更多车,失败
if(now==n+1){
ans=min(ans,cnt);
return;
}
for(int i=1;i<=cnt;i++)
{
if(cab[i]+c[now]<=w)//在已租用的车中可以装下
{
cab[i]+=c[now];
dfs(now+1,cnt);//再装下一个,
cab[i]-=c[now];//又返回过来了,说明不行,还原
}
}
cab[cnt+1]=c[now];//循环完都不行,再新装一辆车
dfs(now+1,cnt+1);
cab[cnt+1]=0;//如果不行,清空车,返回
}
signed main()
{
IOS
cin>>n>>w;
for(int i=1;i<=n;i++)
cin>>c[i];
sort(c+1,c+n+1,greater<int>());
ans=n;
dfs(1,0);
cout<<ans<<'\n';
}