【DFS的分支限界】(例题-算式等式)
不知道DFS的请滚去 这里瞅一眼再说。
—分支限界—
基本概念:
类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
虽然这么说但是老师给的题目也没有只求一个最优解
还是根据一道题目进行讲解吧。
比如下面这道题:算式等式

说真的要是按照概念来这道题也不是求啥最优解为什么要用分支限界
那我们来看看用分支限界怎么来解决这道题目。
按照题目来说,我们要把限制的这个界进行改动(选择几个加数),所以最多会出现n-1个加数,最少会出现2的加数,我们的界就应该从2~n-1,每次改变界的时候进行搜索
因为需要这些加数的和在这个数列中,而遍历查找又会花费太多的时间,所以我们不妨在输入的时候把他们也加紧一个set(集合)
所以基本框架::
#include<bits/stdc++.h>
using namespace std;
int n,num[110],q;
set<int> s;
bool flag[10001],fir;
set<int> s;
void dfs(...)...
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
s.insert(num[i]);
}
for(q=2;q<n;q++)
{
dfs(...);
}
return 0;
}
接下来就是搜索的策略的考虑。
因为用到了分支限界法,所以我们不妨通过其中一个界来探讨规律:
就按样例来说
Input
6
1 3 5 7 8 9
Output
1+7=8
1+8=9
…
接下来模拟搜索思路,过程可能有些繁琐,没兴趣的可以跳过:
找到num[1]值为1,num[2]未被选择,找到num[2]值为3,sum为4,深度超过界限,查找sum,未找到,返回,num[3]未被选择,找到num[3]值为5,sum值6,深度超限,未找到sum,返回,num[4]未被选择,找到num[4]值为7,sum值8,深度超限,找到sum,输出1+7=8,返回,num[5]未被选择,找到num[5]值为8,sum为9,深度超限,找到sum,输出1+8=9,返回,第一次搜索结束
很明显,只要搜索深度超限,不管是否满足题目条件,分支限界都会让函数直接返回!这就是分支限界法在dfs中最大的体现。
然后再加一个pre(上一次选数的位置)为了优化程序,就可以写出下面的代码,输出控制格式不多说,其他的如果看不懂看看上面的思路就可以了。
#include<bits/stdc++.h>
using namespace std;
int n,num[110],q;
set<int> s;
bool flag[10001],fir;
void dfs(int sum,int pre,int dep)
{
if(dep==q+1)
{
if(s.count(sum))
{
fir=1;
for(int i=1;i<=n;i++)
{
if(flag[i])
{
if(!fir)
cout<<"+"<<num[i];
else
{
cout<<num[i];
fir=0;
}
}
}
cout<<"="<<sum<<endl;
}
return;
}
for(int i=pre;i<=n;i++)
{
if(!flag[i])
{
flag[i]=1;
dfs(sum+num[i],i+1,dep+1);
flag[i]=0;
}
else break;
}
return;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
s.insert(num[i]);
}
for(q=2;q<n;q++)
{
dfs(0,1,1);
}
return 0;
}
dfs在主程序中给出的初值也很好理解:sum=0因为还没有选择任何数,pre=1因为要从pre开始美剧,dep深度自然为1.
ov.
【DFS的分支限界】(例题-算式等式)的更多相关文章
- 【DFS例题】等式
题目如下: 这道题依然是一道dfs(要求输出方案数很明显用dfs呐) 首先一个模板贴上来: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return ...
- 深度搜索(dfs)+典型例题(八皇后)
深度优先搜索简称深搜,从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. 如上面的图所示:加入我们要找一个从V0到 ...
- ZOJ1204——Additive equations(DFS)
Additive equations Description We all understand that an integer set is a collection of distinct int ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- N皇后问题(DFS)
题目:在N*N的国际象棋棋盘上放置N个皇后彼此不受攻击(即在棋盘的任一行,任一列和任意对角线上不能放置2个皇后),求解所有摆放方案的总数. 样例输入: 1 8 样例输出: 1 92 解题思路:由于皇后 ...
- DFS做题小结
一.深入理解DFS 采用递归写法 深度优先,思路就是沿着一条路一直走,直到走到死胡同,原路返回,返回到有多条道路的地方换其他路走.直到这条支路全部都访问过了,按照原路返回,回到起点,如果起点还有别的支 ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- DFS(深度优先搜索)
基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...
- dfs求连通块
递归 递归是什么?绝大部分人都会说:自己调用自己,刚开始我也是这样理解递归的.确实没错,递归的确是自己调用自己.递归简单的应用:编写一个能计算斐波那契数列的函数,也就是这样: int fb(int n ...
随机推荐
- Resources.resx 未将对象引用设置到对象的实例
原文:解决使用DevExpress开发错误:未将对象引用设置到对象的实例 在使用DevExpress是总是会出现一些状况.这次同事在他的机器上调试完毕的代码发过来,却出现“未将对象引用设置到对象的实例 ...
- 零元学Expression Blend 4 - Chapter 45 ListBox里的物件不能换行吗?
原文:零元学Expression Blend 4 - Chapter 45 ListBox里的物件不能换行吗? ListBox里的排列不是垂直就是水平,觉得这样的排列很枯燥乏味吗? 想要它变聪明吗? ...
- 【Windows10 IoT开发系列】“Hello,World!”指导
原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. 1.在启动V ...
- Qt paintEvent绘制窗体 注意Qt::WA_PaintOutsidePaintEvent 只是适用于X11,其他系统均无效
QPainter默认只能在paintEvent里面调用,但是: 在其他事件中绘制窗体,提示信息如下:QPainter::begin: Paint device returned engine == 0 ...
- Ubuntu14.04 静态编译安装Qt4.8.6
./configure -static -nomake demos -nomake examples -nomake tools -no-exceptions -prefix /usr/local/Q ...
- 客服端JavaScript线程模型
JavaScript语言核心并不包含任何线程机制,并且客服端JavaScript传统上没有定义任何线程机制.HTML5定义了一种作为后台线程的“WebWorker",但是客服端JavaScr ...
- 对新数据库使用 Code First
如果使用的是 Visual Studio 2010,还需要安装 Nuget 1.创建应用程序 简单起见,我们将构建一个使用 Code First 执行数据访问的基本控制台应用程序. 打开 Visual ...
- 台电P89s mini root教程
根据论坛内的一些内容再结合自己的使用心得整理如下,本人双11购入P89s mini root成功 自带软件什么的都不见了 以下是个人root过程,有不一样的地方欢迎交流,说实话我也不是很懂 1.升级 ...
- c++类运算符重载遇到的函数形参问题
class A { public: A(int arg1, int arg2); ~A(); A &operator = ( A &other); A operator + ( A & ...
- php PAC 安装
LIUNX wget http://pecl.php.net/get/APC-3.1.8.tgz tar -zxvf APC-3.1.8.tgz cd APC-3.1.8 /usr/local/php ...