洛谷 P10483 小猫爬山 完整题解

一、题目查看

P10483 小猫爬山 - 洛谷

二、解题思路

我们将采取递归 + 剪枝的思想:

sum数组存放每辆车当前载重。

每次新考虑一只小猫时,我们尝试把它放进每个可以放进的缆车中(需要回溯)

cpp 复制代码
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];
	}
}

我们还要再尝试为它单独新开一辆缆车,不然会错(也要回溯)

cpp 复制代码
sum[k] = c[u];
dfs(u + 1, k + 1); // 再开一个缆车
sum[k] = 0;

最后我们需要更新答案和剪枝

cpp 复制代码
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;
}

四、测试结果

相关推荐
执着25919 小时前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
2501_9011478319 小时前
学习笔记:单调递增数字求解的迭代优化与工程实践
linux·服务器·笔记·学习·算法
数智工坊19 小时前
【数据结构-特殊矩阵】3.5 特殊矩阵-压缩存储
数据结构·线性代数·矩阵
AI科技星19 小时前
张祥前统一场论核心场方程的经典验证-基于电子与质子的求导溯源及力的精确计算
线性代数·算法·机器学习·矩阵·概率论
kebijuelun19 小时前
ERNIE 5.0:统一自回归多模态与弹性训练
人工智能·算法·语言模型·transformer
芝士爱知识a19 小时前
AlphaGBM 深度解析:下一代基于 AI 与蒙特卡洛的智能期权分析平台
数据结构·人工智能·python·股票·alphagbm·ai 驱动的智能期权分析·期权
兩尛19 小时前
160. 相交链表/c++
数据结构·链表
历程里程碑19 小时前
普通数组----最大子数组和
大数据·算法·elasticsearch·搜索引擎·排序算法·哈希算法·散列表
2302_8138062219 小时前
【嵌入式修炼:数据结构篇】——单向链表的排序
数据结构·链表·排序算法
2302_8138062220 小时前
【嵌入式修炼:数据结构篇】——树和二叉树
数据结构