
回溯法(DFS)
勤奋的懒羊羊o
东北林业大学 计算机科学与技术本科毕业
现东南大学网安硕士在读 欢迎交流
展开
-
图的m着色问题(子集树回溯法)
解空间:子集树题目比较容易,直接附代码代码#include <iostream>using namespace std;int n; //图的顶点数int x[100]; //当前解int a[100][100]; //邻接矩阵int m; //可用颜色数量int sum = 0; //当前已经找到的可m着色方案数bool OK(int t){ for (int i =..原创 2021-05-25 21:16:32 · 857 阅读 · 1 评论 -
TSP旅行售货员问题(排列树回溯法)
问题描述代码#include <iostream>#include <cstdlib>using namespace std;#define N 100int n; //表示城市个数int a[N + 1][N + 1];int x[N];int bestx[N];int bestc = -1; //最右路径长度;int cc = 0; //当前路径的长度void Backtrcak(int i){ if (i > n) // 当到达原创 2021-05-25 16:38:44 · 939 阅读 · 0 评论 -
最大团问题(子集树回溯法)
解空间:子集树可行性约束函数:顶点t到已经选入顶点集中每一个顶点之间都有边限界函数:有足够多的可选择的顶点使得算法有可能在右子树中找到更大的团(即cn+(n-t)>bestn)复杂度分析:O(n*2^n)需要掌握的习题代码#include <iostream>using namespace std;int n; //图的顶点个数int cn; //当前顶点数int x[100]; //当前解int bestx[100]; //当前最优解i原创 2021-05-25 08:41:35 · 1399 阅读 · 2 评论 -
N皇后问题(子集树、排列树回溯法)
> 这题既可以采用子集树也可用排列树问题描述解向量可行性约束限界约束代码一:子集树解决#include <iostream>using namespace std;int x[100]; //皇后的位置(i,x[i]),即x[i]表示皇后在i行的列位置int n; //棋盘规格int sum = 0;bool Place(int t) //实现限界约束判断{ for (int i = 1; i <t;i++)原创 2021-05-24 18:26:17 · 4250 阅读 · 0 评论 -
符号三角形数量(子集树回溯法)
问题描述可行性约束条件:当前符号三角形所包含的“+”和“-”个数均不超过n*(n+1)/4限界函数(无解的判断)n*(n+1)/2为奇数确定x[i+1]的值后,只要在前面确定的符号三角形的右边加一条边就扩展为x[1:i+1]所相应的符号三角形代码#include <iostream>using namespace std;int n = 0; //第一行符号的个数int half = 0; //符号总数的一半int count = 0; //"原创 2021-05-24 15:01:20 · 353 阅读 · 1 评论 -
批处理作业调度(排列树回溯法)
问题描述:每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和。对于给定的n个作业,指定最佳作业调度方案,使其完成时间和达到最小。约束条件: 当前时间和小于当前最优解才有可能产生新的最优解,否则直接剪枝,不用再遍历这棵子树。作业流程: 画个简图加强一下作业工作流程排列树代码#i原创 2021-05-23 21:56:56 · 870 阅读 · 0 评论 -
装载问题(子集树回溯法)
题目最终要求的是选取全体集装箱的一个子集,使该子集中集装箱重量之和最接近第一艘轮船的载重量。所以是子集树约束函数:解向量的集装箱重量之和小于第一艘轮船载重量限界函数:当前载重量cw+剩余集装箱的重量rest≤当前最优载重量bestw考虑了限界函数的程序代码如下:#include <iostream>using namespace std;int C=0; //第一艘轮船的载重量 int n=0; //集装箱数量int原创 2021-05-23 17:34:41 · 704 阅读 · 2 评论 -
算法设计与分析第五章回溯法复习
回溯法的基本思想基本步骤①针对所给问题,定义问题的解空间;②确定易于搜索的解向量空间;③以深度优先搜索方式(DFS)搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。常用剪枝函数①约束函数再扩展结点处剪去不满足约束条件的子树②用限界函数剪去得不到的最优解的子树子集树和排列数子集树:从n个元素的集合S中找出满足某种性质的子集时,相应的解空间为子集树。排列数:当所给的问题是确定n个元素满足某种性质的排列时,相应的解空间称为排列数,排列数通常有n!个结点。...原创 2021-05-23 17:19:18 · 247 阅读 · 3 评论 -
0-1背包问题(子集树回溯法)
代码一:只考虑约束函数,即背包里的物品重量之和小于背包容量#include <iostream>using namespace std;int C,n,w[100],v[100];int BestX[100]; //BestX[i]=1代表物品i放入背包,0代表不放入int CurValue=0; //当前放入背包的总价值int CurWeight=0; //当前放入背包的总重量int BestValue=0; //最优值,当前的最大价值int x[100];原创 2021-05-01 21:51:21 · 1139 阅读 · 1 评论