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;
}
posted @ 2024-05-19 13:59  Vitamin_B  阅读(12)  评论(0)    收藏  举报  来源