<DFS剪枝>数字王国之军训排队

DFS剪枝

其实就是将搜索过程一些不必要的部分直接剔除掉。

剪枝是回溯法的一种重要优化手段,往往需要先写一个暴力搜索,然后找到某些特殊的数学关系,或者逻辑关系,通过它们的约束让搜索树尽可能浅而小,从而达到降低时间复杂度的目的。

示例:

分析:

n->1,10,数据范围并不是很大,我们可以考虑枚举所有答案来找到这个最合适的队伍数量。

就比如说,我现在有n个人,那么最多的队伍数量肯定不超过n,所以我们可以从只有1个队伍枚举到有n个队伍,肯定能找到其中一种方案符合题意。当时由于一个队伍中不能有处于倍数关系的整数,所以我们可以使用剪枝做优化,在一开始就判断,如果不符合题意就排除掉,提高效率。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n;
int a[N];
vector<int> v[N];
int dfs(int cnt,int dep){
	if(dep==n+1){
		return true;
	}
	
	for(int i=1;i<=cnt;i++){
		bool tag=true;
		for(const auto&j:v[i]){
			if(a[dep]%j==0){
				tag=false;break;	
			}
		}
		if(!tag)continue;
		v[i].push_back(a[dep]);
		if(dfs(cnt,dep+1))return true;
		//恢复现场 
		v[i].pop_back();
	}
	return false;
}
int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	
	for(int i=1;i<=n;i++){
		if(dfs(i,1)){ //有i个队伍,第1层出发 
			cout<<i<<'\n';
			break;
		}
	}
	return 0;
}
相关推荐
土司大王4 小时前
LeetCode hot100——对称二叉树
算法·leetcode·职场和发展
sali-tec4 小时前
C# 基于OpenCv的视觉工作流-章106-差值追踪
图像处理·人工智能·opencv·算法·计算机视觉
Navigator_Z4 小时前
LeetCode //C - 1208. Get Equal Substrings Within Budget
c语言·算法·leetcode
手写码匠4 小时前
Dify 多 Agent 工具权限与安全沙箱实战:让智能体“有能力,但不越权“
人工智能·深度学习·算法·aigc
黎阳之光4 小时前
打破堆场感知黑盒:黎阳之光视频孪生,构建港口码头网格化透明管控新体系
大数据·人工智能·算法·安全·数字孪生
大模型码小白5 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
sel_96 小时前
【多轮对话论文导读(三)】多轮对话与Agent论文阅读笔记:用户模拟、轨迹生成与长期记忆
论文阅读·人工智能·笔记·深度学习·算法·机器学习
Asize6 小时前
438. 找到字符串中所有字母异位词
算法
Asize6 小时前
283. 移动零
算法
船厂电气自动化ai大模型8 小时前
AI大模型与数学·第57课 傅里叶全套工具链综合实战:串联级数/连续变换/DFT/FFT,图像、音频、扩散模型完整例题
数据结构·人工智能·深度学习·算法·机器学习