题目大意:n只猫下山,每只猫都有不同的重量,让他们坐缆车下山,缆车有一个最大承重梁,最少用多少缆车可以把这些猫都运下去
思路:
枚举每一只猫,质量从大到小,使分支最少,每只猫可以加入已有的缆车或者开一辆新车
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
int n, m;
int w[N];
int 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] + w[u] <= m){//可行性剪枝
sum[i] += w[u];
dfs(u + 1, k);
sum[i] -= w[u];//恢复现场
}
sum[k] = w[u];
dfs(u + 1, k + 1);
sum [k] -= w[u];
}
int main(){
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> w[i];
sort(w, w + n);
reverse(w, w + n);//优化搜索顺序
dfs(0, 0);
cout << ans << endl;
return 0;
}