洛谷 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;
}

四、测试结果

相关推荐
阿彬爱学习1 小时前
AI 大模型企业级应用落地挑战与解决方案
人工智能·算法·微信·chatgpt·开源
L.fountain1 小时前
配送算法10 Batching and Matching for Food Delivery in Dynamic Road Networks
算法·配送
啊阿狸不会拉杆4 小时前
《算法导论》第 13 章 - 红黑树
数据结构·c++·算法·排序算法
三次拒绝王俊凯4 小时前
用生活日常的案例来介绍“程序运行时,对函数的调用一般有两种形式:传值调用和引用调用 和 这两种调用有什么区别?
java·数据结构
qiuyunoqy4 小时前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
lifallen5 小时前
Kafka ISR机制和Raft区别:副本数优化的秘密
java·大数据·数据库·分布式·算法·kafka·apache
m0_626535206 小时前
贪心算法学习 3 买卖股票的最佳时机 i ii
学习·算法·贪心算法
zxctsclrjjjcph6 小时前
【递归、搜索和回溯】FloodFill 算法介绍及相关例题
c++·算法·leetcode·宽度优先·深度优先遍历
机器学习之心6 小时前
灰狼算法+四模型对比!GWO-CNN-LSTM-Attention系列四模型多变量时序预测
算法·cnn·lstm·gwo-cnn-lstm
GoodTime7 小时前
Datawhale AI夏令营 -「多模态RAG图文问答挑战赛」
人工智能·python·算法