165. 小猫爬山(DFS之剪枝与优化)

165. 小猫爬山 - AcWing题库

翰翰和达达饲养了 N 只小猫,这天,小猫们要去爬山。

经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。

翰翰和达达只好花钱让它们坐索道下山。

索道上的缆车最大承重量为 W,而 N 只小猫的重量分别是 C1、C2......Cn。

当然,每辆缆车上的小猫的重量之和不能超过 W。

每租用一辆缆车,翰翰和达达就要付 1 美元,所以他们想知道,最少需要付多少美元才能把这 N 只小猫都运送下山?

输入格式

第 1 行:包含两个用空格隔开的整数,N 和 W。

第 2..N+1 行:每行一个整数,其中第 i+1 行的整数表示第 i 只小猫的重量 Ci。

输出格式

输出一个整数,表示最少需要多少美元,也就是最少需要多少辆缆车。

数据范围

1≤N≤18

1≤Ci≤W≤108

输入样例:
复制代码
5 1996
1
2
1994
12
29
输出样例:
复制代码
2

解析 :

DFS之剪枝与优化主要方法:

1.优化搜索顺序:大部分情况下,我们应该优先搜索分支较少的节点
2.排除等效冗余
3.可行性剪枝
4.最优性剪枝
5.记忆化搜索(dp)

cpp 复制代码
#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
using namespace std;
typedef long long LL;
const int N = 20;
int n, w;
int cr[N], sum[N];
int ans;

int cmp(const int& a, const int& b) {
	return a > b;
}

void dfs(int u, int k) {
	//最优性剪枝
	if (k >= ans)return;
	if (u > n) {
		ans = k;
		return;
	}
	for (int i = 1; i <= k; i++) {
		if (sum[i] + cr[u] <= w) {//可行性剪枝
			sum[i] += cr[u];
			dfs(u + 1, k);
			sum[i] -= cr[u];//恢复现场
		}
	}
	sum[k + 1] = cr[u];
	dfs(u + 1, k + 1);
}

int main() {
	cin >> n >> w;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &cr[i]);
	}
	//优化搜索顺序
	sort(cr + 1, cr + 1 + n, cmp);
	ans = n;
	dfs(1, 1);
	cout << ans << endl;
	return 0;
}
相关推荐
写代码写到手抽筋7 小时前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.7 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
wayz118 小时前
Momentum:PSL(心理线指标)技术指标详解
算法·金融·数据分析·量化交易·特征工程
8Qi88 小时前
LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
算法·leetcode·职场和发展·动态规划
三品吉他手会点灯8 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
乐迪信息9 小时前
乐迪信息:AI算法盒子实时识别船舶烟雾与火焰异常
大数据·人工智能·算法·安全·目标跟踪
J-Tony119 小时前
【JVM】根可达算法
jvm·算法
艾iYYY9 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法
Lsk_Smion9 小时前
力扣实训 _ [75].颜色分类 _ 杨辉三角
数据结构·算法·leetcode