小猫爬山
题型
dfs题
题目
索道最大承重量W
N只小猫重量C1、C2、…
需多少个缆车
思路
猫:①去已租的缆车②新开一辆缆车
dfs(cat_num, cable_num)
①dfs(cat_num + 1, cable_num) cable_v + …
②dfs(cat_num + 1, cable_num + 1)
cat_num == N,边界
提高效率(剪枝)
1、重量较大的小猫比重量轻的小猫更难运送,可以在搜索前把小猫按照重量递减排序
2、若cab数大于当前搜索的最小ans,则不用继续搜索了
// dfs
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 20;
long long v[N], w[N], W;
int n;
int ans = N + 1;
//不知道为什么一定要写这个cmp函数,否则会出错
bool cmp(long long a,long long b) {
return a > b;
}
void dfs(int cat_num, int cable_num)
{
if(cable_num >= ans) {
return;//剪枝,没必要搜了
}
if(cat_num > n) {
ans = min(ans, cable_num);
return;
}
for(int i = 1; i <= cable_num; i ++)
{
if(v[i] + w[cat_num] <= W)
{
v[i] += w[cat_num];
dfs(cat_num + 1, cable_num);
v[i] -= w[cat_num]; // 恢复,为了进行下一次循环
}
}
//没有缆车符合要求
v[cable_num + 1] = w[cat_num];
dfs(cat_num + 1, cable_num + 1);
v[cable_num + 1] = 0; //恢复
}
int main()
{
cin >> n >> W;
for(int i = 1; i <= n; i++) cin >> w[i];
sort(w + 1, w + n + 1, cmp);
dfs(1, 0);
cout << ans << endl;
return 0;
}