深度优先搜索(dfs) 体会
深度优先,就是与回溯法结合,是一种暴力的枚举,可以配合一些剪枝,减少搜索量。
要考虑的问题
- 枚举对象
- dfs的参数
- 返回条件
- 剪枝技巧
原题链接
枚举对象:
- 车的数量,从1开始 。
- 每次车的数量都需要用for枚举cat的放置情况
dfs 参数:
- 当前的cat,当前枚举的车的数量
剪枝技巧:
- 从选择最少的量开始枚举 这里可以将cat的w从大排到小
- 当当前车的数量大于之前记录的车的数量ans是剪枝
返回条件:
- 比较简单,当前cat == 总cat 时枚举结束了
####AC代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
int n, m;
int cat[N], sum[N];
int ans = N;
void dfs(int u, int k)
{
if(k > ans) return;
if(u == n){
ans = k; return;
}
for(int i = 0; i < k; i++)
if(sum[i] + cat[u] <= m)
{
sum[i] += cat[u];
dfs(u+1, k);
sum[i] -= cat[u];
}
sum[k] = cat[u];
dfs(u+1, k+1);
sum[k] = 0;
}
int main()
{
cin >> n >> m;
for(int i = 0; i < n; i++) cin >> cat[i];
sort(cat, cat+n);
reverse(cat, cat+n); //可以学习下排序反转
dfs(0,0);
cout << ans;
}