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

四、测试结果

相关推荐
宸码26 分钟前
【机器学习】【无监督学习——聚类】从零开始掌握聚类分析:探索数据背后的隐藏模式与应用实例
人工智能·python·学习·算法·机器学习·数据挖掘·聚类
Kylin52436 分钟前
C语言经典代码——part 30
c语言·开发语言·算法
又菜又爱玩的东哥1 小时前
字符串的常见操作【C语言】
c语言·开发语言·算法
Solitudefire1 小时前
蓝桥杯刷题——day1
java·算法·蓝桥杯
TT哇1 小时前
【每日一练 基础题】[蓝桥杯 2022 省 A] 求和
java·算法·蓝桥杯
奶油泡芙9311 小时前
Insert Digit插入数字
c++·算法
两袖清风9981 小时前
【算法】—— 前缀和
java·数据结构·算法
不烦下雨c2 小时前
【优选算法】二分算法(在排序数组中查找元素的第一个和最后一个位置,寻找峰值,寻找排序数组中的最小值)
算法
uhakadotcom2 小时前
杀疯了,90后博士第一次创业,刚成立1年半,融资12亿,估值30亿
后端·算法·架构
weisian1512 小时前
Redis篇-9--数据结构篇1--五种基本结构(String,List,Set,Sorted Set,Hash,BLPOP阻塞逻辑)
数据结构·redis·list