DFS剪枝整理

本文整理了关于搜索算法中的几种剪枝应用,包括:DFS剪枝在不同问题中的实践,如摩尔报数问题、超级书架问题、配载问题和双胞胎礼物分配问题。通过剪枝优化算法,提高求解效率。
摘要由CSDN通过智能技术生成

这里是笔者近期学习的一下关于搜索的垃圾小剪枝,这里做一个整理,总结一下知识
下面给出一些例题:

一:非常报数
问题描述
摩尔们的整队报数,比较特别。第一个摩尔报数为0,从第二摩尔开始,报数为它前面摩尔报数加1或者减1。
如此这样n个摩尔报数的情况,形成多种数列。譬如,有4个摩尔报数,所有可能的报数数列共有如下8种:

0 1 2 3

0 1 2 1

0 1 0 1

0 1 0 -1

0 -1 0 1

0 -1 0 -1

0 -1 -2 -1

0 -1 -2 -3

对于每一种数列,都有其对应的各项之和。以上8种数列中,对应的和为6、4、2、0、0、-2、-4、-6 。其中和为0的有2种。
现在想知道的是n个摩尔排成一列,按照摩尔报数规则报数,报数形成的数列之和为s的情况有多少种?

输入格式
共一行,两个正整数,分别为n和s。
输出格式
一个数x,表示n个摩尔报数,共有x种数列之和为s。
输入样例
4 0
输出样例
2
数据规模
0<n<=30

解析
这题的暴搜几乎没有实现难度,但是得剪枝,QWQ

如果要剪枝的话,我们无非是从过去或未来开始构思,但是在这道题中,是比较适合将病枝扼杀在摇篮里的——思考未来——按题意给出两种极端情况——全是加或全是减,过小或过大都是没救,全部剪掉

代码

#include <bits/stdc++.h>
using namespace std;

int n,s;
long ans = 0;
int a[35];

int inc(int a,int b)    //加的极端情况
{
	int total = 0;
	for (int i = a; i <= n; i++)
		b++, total += b;
	
	return total;
}

int dec(int a,int b)    //减的极端情况
{
	int total = 0;
	for (int i = a; i <= n; i++)
		b--, total += b;
	
	return total;
}

void 
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS(深度优先搜索)是一种常见的图遍历算法,它使用递归或栈的方式,从一个顶点出发,沿着一条路径一直到达最深的节点,然后回溯到上一层继续遍历其他节点。DFS常被用于解决图的连通性问题、路径问题等。在实际应用中,可以使用DFS进行状态搜索、图的遍历、拓扑排序等。 剪枝是指在搜索过程中,通过一系列的策略判断,提前终止当前搜索分支,并跳过一些无用的搜索路径,从而减少搜索时间。剪枝的核心在于提前排除某些明显不符合条件的状态,以减少无效搜索的时间开销,提高效率。在算法设计中,剪枝通常会利用一些特定的性质或条件进行判断,从而缩小搜索空间。 动态规划是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划通常用于求解最优化问题,它通过定义状态和状态转移方程,采用自底向上的思路,逐步求解每个子问题的最优值,最终得到原问题的最优解。动态规划的核心是存储已经计算过的子问题的解,避免了重复计算。 贪心算法是一种基于局部最优解的策略,它通过每一步选择在当前状态下最优的解,以期望得到全局最优解。贪心算法的基本思想是由局部最优解推导出全局最优解,通常通过贪心选择性质、最优子结构和贪心选择构成三部分。贪心算法相比其他算法,如动态规划,它的优势在于简单、高效,但缺点在于不能保证获取到全局最优解,只能得到一个近似解。 综上所述,DFS剪枝、动态规划和贪心算法在算法设计和问题求解中都发挥着重要的作用。具体使用哪种算法取决于问题的性质和要求,需要在实际应用中进行综合考虑和选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值