P10483 题解
dfs 练手题。
思路
我们可以把每一辆车上的目前总重量记录下来,然后对于每一只猫枚举每一辆车,要么蹭上一辆车继续 dfs,要么自己新开一辆车 dfs。也可以再加一个最优性剪枝(即如果当前车数大于已知最优解就直接结束)。我这里还用了一个从大到小排序的优化,因为越小的越容易蹭车,不用开新车嘛。
代码
# include <bits/stdc++.h>
using namespace std;
int n, w, a[20], g[20], ans = 25;
void dfs (int tot, int step) {
if (tot >= ans)
return ;
if (step >= n) {
ans = tot;
return ;
}
for (int i = 0; i < tot; ++ i)
if (g[i] + a[step] <= w) {
g[i] += a[step];
dfs (tot, step + 1);
g[i] -= a[step];
}
g[tot] = a[step];
dfs (tot + 1, step + 1);
g[tot] = 0;
return ;
}
int main () {
cin >> n >> w;
for (int i = 0; i < n; ++ i)
cin >> a[i];
sort (a, a + n, greater <int> ());
dfs (0, 0);
cout << ans;
return 0;
}

浙公网安备 33010602011771号