不知道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的分支限界】(例题-算式等式)的更多相关文章

  1. 【DFS例题】等式

    题目如下: 这道题依然是一道dfs(要求输出方案数很明显用dfs呐) 首先一个模板贴上来: void dfs()//参数用来表示状态 { if(到达终点状态) { ...//根据题意添加 return ...

  2. 深度搜索(dfs)+典型例题(八皇后)

    深度优先搜索简称深搜,从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”. 如上面的图所示:加入我们要找一个从V0到 ...

  3. ZOJ1204——Additive equations(DFS)

    Additive equations Description We all understand that an integer set is a collection of distinct int ...

  4. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  5. N皇后问题(DFS)

    题目:在N*N的国际象棋棋盘上放置N个皇后彼此不受攻击(即在棋盘的任一行,任一列和任意对角线上不能放置2个皇后),求解所有摆放方案的总数. 样例输入: 1 8 样例输出: 1 92 解题思路:由于皇后 ...

  6. DFS做题小结

    一.深入理解DFS 采用递归写法 深度优先,思路就是沿着一条路一直走,直到走到死胡同,原路返回,返回到有多条道路的地方换其他路走.直到这条支路全部都访问过了,按照原路返回,回到起点,如果起点还有别的支 ...

  7. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  8. DFS(深度优先搜索)

    基本概念 深度优先搜索算法(Depth First Search,简称DFS):一种用于遍历或搜索树或图的算法. 沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过或者在搜 ...

  9. dfs求连通块

    递归 递归是什么?绝大部分人都会说:自己调用自己,刚开始我也是这样理解递归的.确实没错,递归的确是自己调用自己.递归简单的应用:编写一个能计算斐波那契数列的函数,也就是这样: int fb(int n ...

随机推荐

  1. WPF 使用Trigger遇到的问题

    1. 在style中使用trigger无效的场景 原因是直接在对象上设置值将导致style中的值无效,去掉TextBlock对象的Foreground后,Trigger将正常工作 <TextBl ...

  2. ORACLE 错误 ora-01830 解决方法

    http://www.cnblogs.com/BetterWF/archive/2012/06/20/2556442.html 错误产生原因:date类型不能包含秒以后的精度. 如日期:2012-06 ...

  3. Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局

    原文:Android零基础入门第31节:几乎不用但要了解的AbsoluteLayout绝对布局 前面几期基本学习了Android开发中常用的四种布局,之所以把AbsoluteLayout放在后面来学习 ...

  4. asp.net处理请求

    当用户通过客户端浏览器向Web服务器发出请求时,Web服务器检查所请求页的扩展名, 如果是aspx,就会启动ASP.NET引擎处理该请求.ASP.NET引擎首先会检查输出缓冲中, 是否有此页面或此页面 ...

  5. AngularJS的简单使用(入门级)

    AngularJS诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中. AngularJS有着诸多特性,最为 ...

  6. 系统休眠消息PBT_APMSUSPEND

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa372721(v=vs.85).aspx https://msdn.microso ...

  7. 管道Demo

    使用管道实现读取DOS命令结果,界面如下: 主要代码如下: UpdateData(TRUE); //创建一个管道,用于接收命令执行结果 SECURITY_ATTRIBUTES sa; ZeroMemo ...

  8. Linux正则和grep命令

    设置命令的默认参数和别名 每次都要输入 ls -l ,烦不烦,我想用 ll 来表示 ls -l, 可以,只要在 ~/.bashrc 中加上 alias ll='ls -l' ,然后运行 source ...

  9. 跨平台网络通信与服务器框架 acl 3.2.0 发布,acl_cpp 是基于 acl 库的 C++ 库

    acl 3.2.0 版本发布了,acl 是 one advanced C/C++ library 的简称,主要包括网络通信库以及服务器框架库等功能,支持 Linux/Windows/Solaris/F ...

  10. flask(二)

    1.装饰器坑 使用装饰器后,视图函数名字相同问题view function错误问题 1.给装饰器加functiontools 2.反向生成url地址标志,指定endpoint(endpoint必须唯一 ...