if (k >= ans) return; // 如果缆车数量不如当前最佳答案直接剪枝
if (u == n) ans = k; // 小猫都装完了
三、代码
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int c[N], sum[N];
int n, w, ans;
void dfs(int u, int k) { // u = 第 u 只小猫, k = 缆车数量
if (k >= ans) return; // 如果缆车数量不如当前最佳答案直接剪枝
if (u == n) ans = k; // 小猫都装完了
for (int i = 0; i < k; i++) {
if (sum[i] + c[u] <= w) {
sum[i] += c[u];
dfs(u + 1, k);
sum[i] -= c[u];
}
}
sum[k] = c[u];
dfs(u + 1, k + 1); // 再开一个缆车
sum[k] = 0;
}
int main() {
cin >> n >> w;
ans = n;
for (int i = 0; i < n; i++) {
cin >> c[i];
}
dfs(0, 0);
cout << ans;
return 0;
}