【算法设计zxd】第6章 回溯法

算法分析——第九周(回溯法) 回溯算法 理论依据: 多米诺性质 典型实例 八皇后问题: int flag[8]//标志数组,下标代表列数,值代表行数 伪代码: for j=1 to 8:   if flag[j]==0:     if 处于同一对角线     then 不做处理     else flag[j]=i; 时间复杂度:O(n^n)其实我也不是很清楚 0-1背包问题 getValue(index,value,we... 阅读详情

目录

6.1 回溯法的设计技术 :

四皇后问题

回溯法:

算法框架:

思考题:

回溯算法的适用条件

【例6-1】求满足下列不等式的所有整数解:

6.2回溯算法的经典例题

【例6-2】装载问题

 问题分析

 计算模型

 算法设计与描述

算法分析:

代码:

【例6-3】n皇后问题。

 问题分析 算法思想详见开篇。

 计算模型

 算法设计与描述

 算法分析

另一种:随机算法

【例6-4】 0-1背包问题。

 问题分析

 数学模型

 计算模型

 算法设计与描述

 算法分析

代码:

【例6-5】旅行商问题(Traveling Salesman Problem,简称TSP)。

 问题分析

 计算模型

算法设计与描述:

小结

分支限界法的设计技术

分支限界法:

 约束条件

 剪枝

 分支限界法的设计步骤

思考题:

【例6-6】装载问题。

 计算模型

【例6-7】背包

 问题分析

 问题分析

计算模型

 计算模型

 算法设计与描述

【例6-8】旅行商问题(Traveling Salesman Problem,TSP):

 问题分析

 计算模型

 算法设计与描述


6.1 回溯法的设计技术 :

活结点:可以生成子节点
扩展结点:
死结点:不能再进行子节点生成的

回溯法:

在约束条件下对解空间树进行深度优先搜索的过程,
并在搜索过程中剪去那些不满足条件的分支。
问题的解 :
为n元组(X 1 ,…,X i ,…X n ),其中X i 选自有限集S · ,
当选出一组值X=(x 1 ,…,x i ,…x n )能够使评价函数P(x 1 ,…,x i ,…x n ) 满足问题的某种约束条件或到达极值。
基本策略 :
每次只考虑一个分量,逐次扩大建立n元组,
并随时用评价函数P i (X 1 ,…,X i ,…X n)去判断正在形成的n元组是否有成功的希望,
一旦确定部分元组(X 1 , … ,X i)不能求出解时,则立即停止这种搜索,“剪掉”以当前结点为
根的分枝,
并逐次向上一个分量回溯,
然后向其它分支继续探索

算法框架:

(1) 开始结点 是一个活结点,也是一个 扩展结点 ;
(2) 如果能从当前的扩展结点移动到一个新的结点,那么这
个新结点将变成一个活结点和可扩展结点,旧的扩展结点
仍是一个活结点。
(3) 如果不能移动到一个新结点(已经找到一个解或违反约
束的情况),当前的扩展结点就变成了一个 死结点 ,便只能
返回到最近被考察的活结点(回溯),这个活结点就变成了新
的扩展结点。
(4) 当找到了最优解或者没有活结点的时候(回溯尽了所有的活结点),搜索过程结束
回溯的递归框架回溯的非递归模式
输入:n
输出:所有的解x[]

int x[n],i=1;
search(int i)
{
    if(i>n)//递归出口

       输出结果;
    else//枚举所有可能的路径 
    { 
        for(j=下界;j<=上界;j=j+1)//当前结点的子节点的同一层
        {
            //满足 界限函数和约束条件
            if(P(j))//
            { //深度 下一层
                x[i]=j;//将符合要求的结点的编号,存储到解的数组里
                ...//其他操作
                search(i+1);
                回溯前的清理工作;//再进行for循环 下一个结点
            } 
        } 
    } 
}


int x[n],i=1;
//还未回溯到头, i为真 表示有路可走 
while(i&&(未达到目标) )
{
    if(i>n)//搜索到叶节点 
        搜索到一个解,输出;
    else//处理第i个元素 
    { 
        x[i]第一个可能的值;
        //x[i]不满足约束条件,但在搜索空间内
        while( !P(x[i]) && x[i]在搜索空间内 ) 
            x[i]下一个可能的值;
            
        if( x[i]在搜索空间内)
        {
            标识占用的资源;
            i=i+1;//扩展下一个结点 
        }
        else
        {
            清理所占的状态空间;
            i=i-1;//回溯 
        } 
        
    } 
}

思考题1:

(1)不是唯一, n元组 

(3)剪枝:判断是否满足约束条件。执行:将结点标为死结点。

回溯算法的适用条件

多米诺性质
设向量X i =<x 1 , x 2 ,…,x i >,X i \subseteq X,X = < x 1 , x 2 ,…,x i ,…,x n >,
将X i 输入评价函数P,可以得到X i 的一组 特征值P(X i ),
取X i+1 =<x 1 , x 2 ,…,x i , x i+1 >【增加一个元素】,Xi+1 \subseteq X,则P(Xi+1) 真蕴涵P(X i ),即

 P(Xi+1) ->  P(Xi)   i∈(0,n) ,其中,n代表解向量的维数。

【子集,否则可能丢解】

【例6-1】求满足下列不等式的所有整数解:

解:令X i =<x 1 , x 2 ,…,x i >,P(X i )为对X i 的评估,判断其Xi是否满
足不等式,即P(X i ) ≤10。依据题目可知,本例中向量为一个三元
组< x 1 , x 2 , x 3 > 。

【丢解】

 当x1=1、x2=2时, P(x1 ,x2 )= 5x1+4x2=5*1+4*2=13>10 不满足约束条件,分支x2=2将被剪去

然而,当x 1 =1、x 2 =2、x 3=3时, P(x 1 ,x 2 ,x 3 )= 5x 1 +4x 2 - x 3=5*1+4*2 - 3=10 满足约束条件,即<1, 2, 3>是不等式的解,
显然,此例中P(X 3 )不真蕴涵P(X 2),违反了多米诺性质,从而丢解了。

【解决】

如果令x’3=4-x3 ,将原不等式变换为:5x1+4x2+x’3≤14 1≤xi , x’3≤3 i=1, 2

则该不等式满足多米诺性质,可以使用回溯法,对所得到的解x 1 、x 2 、x’ 3 转
换成原不等式的解x 1 、x 2 、x 3 即可。
代码:
#include<iostream>
using namespace std;


//
int n=3;
int x[3]={1,1,1};

void show(int a[]) 
{
	for(int i=0;i<n;i++)
		cout<<a[i]<<"\t";
	cout<<endl<<endl;
}

//约束条件
bool P(int x[],int i)//表示第几层 
{
	switch(i)
	{
	case 0: 
		if(5*x[0]<=14)return true;
			else return false;
	case 1:
		if(5*x[0]+4*x[1]<=14)return true;
			else return false;
	case 2:
		if(5*x[0]+4*x[1]+x[2]<=14)return true;
			else return false;
	}
	
} 

void fun(int i)
{
//	cout<<i<<"c"<<endl;
//	show(x);
	if(i>n-1)//已经结束了最后一个数 
	{
//		cout<<"结果:";
		show(x);
		return;//结束最后一层,回溯到上一层 
	}
	//若不变 
	if(P(x,i)&&x[i]<4)//符合约束条件 
	{
		x[i]=1;
		fun(i+1); //下一层 
	}
	//若2
	if(P(x,i)&&x[i]<4)//符合约束条件 
	{
		int t=x[i];
		x[i]=2;
		fun(i+1); //下一层 
		x[i]=t;//回复 
	}
	
	//若3
	if(P(x,i)&&x[i]<4)//符合约束条件 
	{
		int t=x[i];
		x[i]=3; 
		fun(i+1); //下一层 
		x[i]=t;//回溯后,本层尝试下一个可能 
	} 
}

int main()
{
	fun(0);
	return 0;
	
} 
/*
1       1       1

1       1       2

1       1       3

1       2       1

1       2       2

1       2       3
*/

6.2回溯算法的经典例题

【例6-2】装载问题

有n个集装箱要装上一艘载重量为c的轮船,其中,集装箱i的重量为w i 。找出一种最优装载方案,让轮船尽可能多装集装箱,即在装载体积不受限制的情况下,尽可能使轮船满载。
 问题分析
设集装箱数量n=5,轮船载重c=10,集装箱的重量w={7,2,6,5,4}

对于n个集装箱的装载问题,可将该问题的解定义为一个n元组
(x 1 ,…,x i ,…x n ), i∈Z, 1≤i≤n, x i ∈{0,1},
x i =1表示装入集装箱i,x i=0表 示不装入集装箱i。

 其中,wi 表示第i个集装箱的重量。

满足多米诺条件 :

 计算模型
1. 数据结构定义
 静态数据结构:
轮船载重量为c,集装箱数量为n,集装箱重量数组 w[],这些变量在运算中不会发生改变。
 动态数据结构:
i表示搜索的层数,加入一个集装箱后计算出的当前 载重量nowc、当前解x[]、当前最优重量maxc、当前最优解maxx[], 剩余的集装箱重量r(初值为全部集装箱重量),
这些值都是边测试 边生成的,当所有计算全部完成后,maxc和maxx[]就是题目要求的 最优值和最优解。
2. 迭代公式
 算法设计与描述
输入:c, n, w[]
输出:最优值maxc和最优解maxx[]
void search (int i){ /*递归法*/
	if(i>n){//搜索完
		if(nowc>maxc){//现在重量值
			maxc=nowc;
			for(int j=1;j<=n;j++)
				maxx[j]=x[j];
		}
		return;
	}
	
	//剩余量 
	r=r-w[i]; //搜索第i层,同时减少可用量
	//若不装,则岸上重量减去
	if(nowc+w[i]<=c){ //满足约束,左子树
		x[i]=1;
		nowc=nowc+w[i];
		search(i+1);//递归搜索i+1层
		nowc=nowc-w[i];//回溯后恢复nowc
	} 
	/*下面开始搜索右子树*/
	if(nowc+r>maxc){ /*大于当前最优*/
		x[i]=0;
		search(i+1); //递归搜索i+1层
	}
	r=r+w[i];//对第i层搜索完毕,恢复r
}
算法分析:
(1)由算法设计与描述推导
T(1) = 2T(1) //集装箱1选择与不选择
2T(1) = 2*2T(1)=2^ 2 T(1)
……
2 ^( n-1) T(1) = 2*2^( n-1) T(1) = 2^ n T(1)
T(n) = T(1)+ 2T(1)+ 2^ 2 T(1)+……+2^ n T(1)
= T(1)*(2^( n+1)  – 1)≤2×2^ n =O(2^ n )
(2) 由选择树推导
结点数为: 1+2+2^ 2 +……+2^ n
=2^( n+1)  - 1≤ 2×2^ n =O(2^ n )
代码:
#include<iostream>
using namespace std;

int n=5;//集装箱数量 
int c=10;//轮船载重
int w[]={7,2,6,5,4};//集装箱的重量

int nowc=0;//当前载重量 
int x[5];//当前解
int maxc=0;//当前最优重量 
int maxx[5]; //当前最优解
int r=7+2+6+5+4;//剩余集装箱的总重量 


void show(int a[]) 
{
	for(int i=0;i<n;i++)
		cout<<a[i]<<"\t";
	cout<<endl<<endl;
}

void search (int i){ /*递归法*/
	if(i>n-1){//搜索完 递归出口 
		if(nowc>maxc){//现在重量值>当前最优 
			//更新最优解 
			maxc=nowc;
			//记录最优解的路径 
			for(int j=1;j<=n;j++)
				maxx[j]=x[j];
		}
		return;//结束最后一层的函数,回溯到上一层进行递归调用 
	}
	
	r=r-w[i]; //此时 陆地上集装箱的剩余重量 
	//若不装,则岸上重量减去
	
	if(nowc+w[i]<=c){ //满足约束(小于轮船载重量),左子树
		x[i]=1;
		nowc=nowc+w[i];
		search(i+1);//递归搜索i+1层
		nowc=nowc-w[i];//回溯后恢复nowc
		//回到上一层 
	}
	/*下面开始搜索右子树 */
	//右子树是否需要递归
	if(nowc+r>maxc){ /*上界函数 此时当前轮船已载重量+剩余集装箱重量 > 当前最优*/
		x[i]=0;
		search(i+1); //递归搜索i+1层
	}//否则不进行递归,也就是可以确认为死结点 
	
	r=r+w[i];//对第i层搜索完毕,恢复r
	//陆地上增加 
}

int main()
{
	search(0);//从第1层开始 
	cout<<maxc<<endl;
	show(maxx);
	
	return 0;
}

【例6-3】n皇后问题。

在n*n的棋盘上放置相互攻击不到的n个皇后。
国际象棋规则:任意两个皇后之间不能处在同一行、同一列和同一斜线上,否则皇后间就可以相互攻击。
请给出满足条件的所有方案。
 问题分析 算法思想详见开篇。
 计算模型
(1)数据结构
        皇后数量为n; sum为可行解的数量。
        x[]记录皇后的摆放位置,下标为皇后所在行,值为列。
/*若数组下标 参与运算,会大大遍历*/
(2)计算模型

其中,式(2)与式(3)共同构成了对式(1)中所取得的值的一个评价,所以可以统称式(2)和式(3)为评价函数P。

 算法设计与描述
输入:皇后的数量n
输出:皇后的摆放位置x[],可以有多组

/*判断当前格局x[1...i],是否符合约束*/
bool ok(int i){
    for(int j=1;j<i;j++)
        //值相等 或 在对角线上 
        if(x[i]==x[j]||(abs(x[i]-x[j])==(i-j)))
            return false;
    return true;
}

void queen(int i){
    
    if(i>n){//找到可行解
        for(int j=1;j<=n;j++)
            printf("%-5d",x[j]);
        printf("\n");
        sum=sum+1;//可行解数目+1 
    }
    
    for(int j=1;j<=n;j++){//每一层都有n个元素 
        x[i]=j;
        if(ok(i))//如果满足约束
            queen(i+1);//搜索第i+1层
        //否则就结束在这一层 
    }
}

 算法分析
由选择树可知:

由ok函数:

时间复杂度为:

另一种:随机算法
程序设计可能很麻烦,实际实现效率非常差。
回溯和随机相结合——更好

【例6-4】 0-1背包问题。

已知有n件物品,物品i的重量为wi、价值为pi。现从 中选取一部分物品装入一个背包内,背包最多可容纳的总重量是m,如何选择才能使得物品的总价值最大?
问题分析
物品数量n=3
物品重量w={10,20,30}
物品价值p={60,100,120}
背包承重m=50

 数学模型

pi第i个物品价值>0,xi第i个物品是否被选择[0,1]

 计算模型
1. 数据结构
背包容量m,物品数量n,物品重量数组w[],物品价值数组p[]。
当前背包重量bagw,当前背包总价bagp,当前最优解x[]
当前最优总价值maxp,最优解maxx[],可用的物品价值r。
2. 迭代公式
算法设计与描述
void bag(int i){
        if(i>n){
                if(bagp>maxp){
                        maxp=bagp;
                        for(int j=1;j<=n;j++){
                                maxx[j]=x[j];
                        }
                }
                return;
        }
        r=r-p[i]; //对第i层进行搜索,用r减少
        if(bagw+w[i]<=m){ //满足约束
                x[i]=1;
                bagw=bagw+w[i];
                bagp=bagp+p[i];
                bag(i+1);
                bagw=bagw-w[i]; //回溯后恢复bagw
                bagp=bagp-p[i]; //回溯后恢复bagp
        }
        if(bagp+r>maxp){ //搜索右子树
                x[i]=0;
                bag(i+1);
        }
        r=r+p[i]; //对第i层进行搜索回来,恢复r
}
算法分析

思考题:

蛮力法 回溯法
区别回溯法有对右子树的剪枝
时间渐进复杂度T(n)=O(2^n)T(n)=O(2^n)
区别在实际运算中,同样情况下回溯法的时间复杂度优于蛮力法,回溯法最坏情况下的时间渐进复杂度与蛮力法相同。
原因回溯法存在剪枝操作。
代码:
#include<iostream>

using namespace std;

int n=3;//物品数量 
int w[]={10,20,30};//物品重量 
int p[]={60,100,120};//物品价值 
int m=50;//背包称重
//使物品总价值最大 

int bagw=0;//当前背包重量
int bagp=0;//当前背包价值
int x[3];//当前最优解
int maxp=0;//当前最优总价值
int maxx[3];//最优解
int r=60+100+120;//可用的物品价值,也就是物品总价值剩余量 

void show(int a[]) 
{
	for(int i=0;i<n;i++)
		cout<<a[i]<<"\t";
	cout<<endl<<endl;
}

void bag(int i)
{
	if(i>n-1)
	{
		if(bagp>maxp)
		{
			maxp=bagp;
			for(int j=0;j<n;j++)
			{
				maxx[j]=x[j];
			}
		}
		return ;
	}
	//
	r=r-p[i];//对第i层进行搜索,r 减少
	
	if(bagw+w[i]<=m)//小于背包总重量(约束条件) 
	{
		x[i]=1;
		bagw=bagw+w[i];//更新当前背包重量
		bagp=bagp+p[i];//更新价值
		bag(i+1);//下一层
		bagw=bagw-w[i];//回溯
		bagp=bagp-p[i]; 
	} 
	if(bagp+r >maxp)//如果当前价值+剩余价值> 当前最大价值 还有递归的必要
	//如果是 当前价值+剩余价值 <= 当前最大价值,那么其实就没有递归的必要了 
	{
		x[i]=0;//右子树 
		bag(i+1);
	}
	r=r+p[i];//对第i层进行搜索回来,回复r 
	
}

int main()
{
	bag(0); 
	cout<<maxp<<endl;
	show(maxx);
	return 0;
}

【例6-5】旅行商问题(Traveling Salesman Problem,简称TSP)。

 问题分析
假设城市数量n=4,V={A,B,C,D},城市间的距离如图6-9所示的图结构。
设出发城市为A,问题的解空间为{A→{B,C,D三者的全排列}→A}
计算模型
1. 数据结构
城市数量n,距离矩阵d[][],城市名称city[]。
当前路径距离nowd,当前路径nowx[],最短距离mind,最优路径x[]。
2. 迭代公式
算法设计与描述:
输入:城市数量n,距离d[][],
城市名city[]
输出:最优路径x[],最优值mind
算法分析
对由n个城市形成的全排列树来说,所含的结点数目为:

蛮力法回溯法
区别
时间渐进复杂度O( (n-1)! )O( (n-1)! )

小结

二分查找算法
分治算法策略的设计模式
大整数乘法和Strassen矩阵乘法
棋盘覆盖问题
选择性问题
递归回溯法求解整数线性规划 使用MATLAB语言实现递归回溯法求解整数线性规划问题 立即下载

相关推荐

从“烧电路”到“软杀伤”:拆解高功率微波(HPM)让无人机失灵的三种物理效应

本文深度解析高功率微波(HPM)如何通过热效应、电磁效应和非线性效应三种物理机制使无人机失灵。从电子元件的热损伤到系统的电磁干扰,再到电路中的非线性破坏,HPM技术为反无人机系统提供了高效的非动能打击手段。文章还探讨了现代无人机的多层级防护策略与应对方案。

weixin_42531886的博客 252

回溯算法及例题

 回溯算法的主要思想是每次只构造解的一个分量,     然后按照下面的方法来评估这个部分构造解。         如果一个部分构造解可以进一步构造而不会违反问题的约束,     我们就接受对解的下一个分量所做的第一个合法选择。         如果无法对下一分量进行合法的选择,就不必再剩下的任何分量再做任何选择了。     在这种情况下,该算法进行回溯,把部分构造解的最后一个分量替换为它的下一个选

魔神翼 3463

滚动时域优化方法

滚动时域优化(Receding Horizon Optimization, RHO),也被广泛称为模型预测控制(Model Predictive Control, MPC),是一种用于动态系统优化和控制的。其核心思想是“在每个当前时刻k,控制器只考虑未来一个(称为“预测时域”或“优化时域”,长度N)内的系统行为。(通过测量或估计得到)。(描述状态如何随输入和干扰变化)。(如果有,可能基于历史数据或假设)。在这个有限的未来时域[k, k+N-1]上,求解一个。这个优化问题的目标是找到一个。

m0_69522810的博客 2291

回溯

你的打赏是我奋笔疾书的动力!​ 按照我的惯例还是先把实例放出来撕咬一番。 例1:n皇后问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线45度上的皇后都会自动攻击)。 例如4皇后: 说明:图展示了4个皇后依次选择列号放置的不考虑约束条件的所有可能(也叫搜索空间),节点代表皇后,有4层代表了有4个皇后,分支代表该皇后可选择放置的列号(1,2,3,...

liao_hb的专栏 3588

YooAsset可寻址模式避坑指南:从路径加载到Addressable的完整迁移方案

本文详细介绍了将Unity项目从传统路径加载迁移到YooAsset可寻址模式的完整方案。针对中大型项目在迁移过程中遇到的路径耦合、依赖管理、热更新等痛点,提供了从架构设计、环境配置、代码迁移到性能优化的实战指南,并分享了实际项目的改造案例与避坑经验,帮助团队高效完成资源管理系统的重构。

weixin_28304023的博客 499

新入手的Atmel-ICE产品说明

【一句话自我介绍】 我是Atmel最新推出的功能强大的调试编程工具,适用于Atmel ARM® Cortex®-M的Atmel SAM和AVR® 系列芯片。 【我支持的软件】 完美支持Atmel Studio 6.2以上版本直接支持ICC8AVR以上版本支持烧录ICCAVR、CVAVR、IAR等生成的HEX文件 【我支持的器件】 支持AVR 32-bit MCUs的JTA

kaloha3的专栏 1万+

回溯法简单练习

C不等式求解 总时间限制: 1000ms 内存限制: 32768kB 描述 有关于变元x1,x2,x3...xn的不等式: k1x1+ k2x2+ k3x3+ ... + knxni, y都是正整数 求所有的非负整数解 输入 输入文件包括两行 第一行是n, 1 第二行包含n+1个用空格分隔的正整数, 分别表示k1, k2...kn, y 输出 输出文件一行一组解, 每

总相宜 3125

HFSS求解器背后的数学原理:从麦克斯韦方程到S参数计算

本文深入解析了Ansys HFSS求解器的数学原理,从麦克斯韦方程出发,详细介绍了模式驱动求解(Driven Solution)和本征模求解(Eigenmode)等核心算法。通过有限元方法和模式匹配技术,HFSS将电磁场问题转化为矩阵方程求解,实现S参数计算和场分布分析,为工程师提供精确的电磁仿真工具。

weixin_28314575的博客 464

算法分析与设计课程复习之回溯法

算法分析与设计课程复习之回溯法 一、基本思想 1.解空间 设问题的解向量为X=(x1,x2,…,xn) ,xi的取值范围为有穷集Si 。把xi的所有可能取值组合,称为问题的解空间。每一个组合是问题的一个可能解。 2.状态空间树 问题解空间的树形式表示 活结点: 如果已生成一个结点而它的儿子结点还没有全部生成,则这个结点叫做活结点;当前正在生成其儿子结点的活结点叫E-结点(正在扩展的结点)。 死结点:不再进一步扩展或者其儿子结点已经全部生成的生成结点是死结点。 二、定义 回溯法(backtracking)

只须一笑不须愁X的博客 3674

华为OD技术面真题 - JAVA开发 - 1

汇总华为OD技术面八股JAVA八股,高频技术真题并提供详细解答。

qq_45776114的博客 1200

Istio ICA考试之路---2-2

找到dr部分,这部分可以在mirroring里找也可以和题2-1一样在Traffic Management的dr里复制,内容都一样。此题之后都是在cluster-2上操作,所以就不需要再切换了.之后的几题2.1节就忽略掉了。可以看到,80%的流量被镜像到了dev上,实际考试这步可以忽略。看到ex-ip是192.168.126.220。获取gw,把gateways加入到vs配置中。获取istio-ingress的ex-ip。就获得了这样一个模板文件。查看2个pod的日志。

Q先生 853

桥本分数(回溯法)

桥本分数题目答案注意 题目 桥本分数。将1,2,3,4,5,6,7,8,9填入如下图的9个方格中,使得等式成立(要求不得重复)。 用回溯法设计求解桥本分数的算法。 输入格式: 整数n(n<=10) 输出格式: 按照字典序,输出前n个等式 输入样例: 在这里给出一组输入。例如: 1 输出样例: 在这里给出相应的输出。例如: 1/26+5/78=4/39 答案 #include<iostream> using namespace std; int n=9,vis[10],n1; int

ljhsq的博客 4721

【nnUNetv2进阶】四、nnUNetv2 魔改网络-小试牛刀-加入注意力机制ChannelAttention

本文介绍了在nnunet中加入ChannelAttention的方法,按照本文教的教程,可以快速完成ChannelAttention的加入和自定义模型的跑通。

AI爱好者的博客,分享计算机领域相关知识 5800

LeetCode刷题——回溯算法

一、回溯算法介绍 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 下面以一道leetcode题目为例讲解一下回溯算法的计算过程以及回溯算法解题的主要步骤。 下面以一道leetcode题目来进行回溯算法的算法题解以及代

Mactavish_Cui的博客 994

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

2.回溯法

基本概念 回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。 基本思想类同于: 图的深度优先搜索 二叉树的后序遍历 基本思想及策略 在包含问题的说有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度搜索解空间树。当搜索到某一结点时,要先判断该结点是否包含问题的解,如果包含,就从该...

L_i_n_o的博客 709

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

PTA_2023年软件设计综合实践_10(回溯法与分治限界法)

将1-9九个数不重复地赋给不同的9个元素 ,实现形如a/bc+d/ef=f/hi 的形式。例:1/26+5/78=4/39 1/32+5/96=7/84 (注意:1/26+5/78=4/39 和5/78+1/26=4/39 只能算一种解),共有多少种不同的解。语言选C7-2 0/1背包有一个背包的最大能承受的重量是 M ,有 n 个物品,每个物品有各自的重量和价值,计算在不超出背包最大承重限制下,背包中物品最大价值可以是多少?

qq_65628600的博客 2452

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

回溯算法

回溯算法 一、迭代算法基本模型 1、定义k(行数或者深度) 2、用一个数组a[i]表示每个节点值的可能性,初始化。 3、父节点选择一种状态值,遍历子节点中所有值。符合条件则输出。不符合的则返回上一层(–k) 4、检查条件方法 5、伪代码样式 一、迭代 1、定义k(行数或者深度) 2、用一个数组a[i]表示每个节点值的可能性,初始化。 3、父节点选择一种状态值,遍历子节点中所有值。符合条件则输出。不...

u013569164的博客 592

c语言回溯法解决倒桥本分数式,回溯法 经典题目 八皇后 桥本分数

回溯法 经典题目 八皇后 桥本分数回溯法经典题目八皇后问题的求解 推广 N 皇后的求解 #include /使用库函数 printf、scanf #include /使用绝对值函数 abs const int N = 100; /假定最多求 100 皇后问题 int xN = -1; /由于数组下标从 0 开始,将数组 xN初始化为-1 void Queue(int n); /函数声明 int P...

weixin_29272301的博客 842

常用算法设计方法——回溯法

常用算法设计方法——回溯法    

耐心点 3321

回溯法求不等式的所有整数解

回溯法求不等式的所有整数解

m0_72671017的博客 1281

不等式的整数解(C++)

【代码】不等式的整数解(C++)

m0_65065082的博客 396

回溯法解决整数分解和

题目: 利用递归算法输出正整数和为n的所有不增的正整数和式。例如当n=5时,不增的和式如下: 5=5 5=4+1 5=3+2 5=3+1+1 5=2+2+1 5=2+1+1+1 5=1+1+1+1+1 #include <stdio.h> #include <stdlib.h> using namespace std; int ans[100]; int n; void h...

weixin_44535077的博客 451

回溯法详解

1、概念 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。 回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 许多复杂的...

qq_40123329的博客 667

回溯法的多米诺性质

最近在复习算法, 没办法,要考试啦. 在复习回溯法的时候终于理解了之前不是很清楚的多米诺性质. 1 回溯法 由于这篇博客主要讲解多米诺性质, 默认大家已经了解回溯法啦,这里对回溯法的具体内容就不进行讲解了,其实是太懒不想写. 回溯法是一个很实用的算法,适合求解搜索问题和优化问题.你也可以将它看做是蛮力法(枚举法)的改进. 但不是什么情况下都可以使用回溯法, 那么就要问了,回溯法的适用条件是什么...

YuanXu's Blog 7211

回溯法 -数据结构与算法

1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。 1、回溯法适用:有许多问题,当需要找出它的解集(全部解)或者要求回答什么解是满足某些约束条件的...

weixin_30925411的博客 754

用回 优快云

百度稍微有点长就没法贴

溪流漫话 1063
上一篇: 第八章动态规划+第九章同余【算法zxd】
下一篇: 【算法设计与分析zxd】第7章 贪心法
羰基绳命
博客等级 码龄6年 239粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值