【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 ...
随机推荐
- Android零基础入门第27节:正确使用padding和margin
原文:Android零基础入门第27节:正确使用padding和margin 前面两期我们学习了LinearLayout线性布局的方向.填充模型.权重和对齐,那么本期我们来学习LinearLayout ...
- 有未经处理的异常(在 xx.exe 中): 堆栈 Cookie 检测代码检测到基于堆栈的缓冲区溢出。
一般这个问题是数组越界. 我产生这个异常的代码是这句:memcpy(tmp_cert.byKey, m_row[2], 255); 255的长度超过了char数组tmp_cert.byKey的长度.
- CoolFormat(Qt Creator也可管理VC的Project)
http://download.csdn.net/download/akof1314/8457593 https://github.com/akof1314/CoolFormat http://dow ...
- [Erlang-0015][Lager] Erlang日志框架Lager简析
项目地址:https://github.com/basho/lager (欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang)
- qlineedit设置背景颜色(使用QPalette的方法不行,必须使用QSS)
使用QPalette的方法不行, ui->le_text->setAutoFillBackground(true);qDebug() << ui->le_text-> ...
- 关于 win32 下磁盘的遍历方法
最近要写个在线专杀的东东,虽然是专杀(本来只要清除几个特定的文件和杀几个特定的进程,然后把用户的注册表恢复正常,很多病毒木马最喜欢干的一件事情就是写 映像劫持 然后机器一重启,安全相关的软件全部玩完了 ...
- netty中的发动机--EventLoop及其实现类NioEventLoop的源码分析
EventLoop 在之前介绍Bootstrap的初始化以及启动过程时,我们多次接触了NioEventLoopGroup这个类,关于这个类的理解,还需要了解netty的线程模型.NioEventLoo ...
- 一步步教你怎么用python写贪吃蛇游戏
目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...
- 直播技术:从性能参数到业务大数据,浅谈直播CDN服务监控
线上服务的有效监控和数据收集,一直是后端服务离不开的话题.直播作为一种经典的分布式系统,监控以及数据收集更是必不可少的工作.如何对海量的服务集群有效的监控和保活,又如何抓取集群中的碎片数据中来优化服务 ...
- 如何两个月刷400道leetcode
前言随着互联网寒潮的到来, 越来越多的互联网公司提高了面试的难度,其中之一就是加大了面试当中手撕算法题的比例.这里说的算法题不是深度学习,机器学习这类的算法,而是排序,广度优先,动态规划这类既考核数据 ...