不知道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. 内存页面的各种属性(就是Read, Write, Execute的组合)

    PAGE_NOACCESS 禁止写入执行读取查看进程内存区域能发现,NOACCESS属性的内存页面都是FREE状态的(未提交使用的内存区域),只有内存区域最后的0x7FFE1000-0x7FFF000 ...

  2. 【Windows10 IoT开发系列】PowerShell的相关配置

    原文:[Windows10 IoT开发系列]PowerShell的相关配置 可使用 Windows PowerShell 远程配置和管理任何 Windows 10 IoT 核心版设备.PowerShe ...

  3. wchar_t string on Linux, OS X and Windows

    Making wchar_t work on Linux, OS X and Windows for CMarkup release 10.1 I learned a couple of humble ...

  4. GetSystemTimeAsFileTime讲解(从1601年1月1日到目前经过的纳秒)

    void WINAPI GetSystemTimeAsFileTime( Out LPFILETIME lpSystemTimeAsFileTime ); 这个函数获取到的是从1601年1月1日到目前 ...

  5. 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题

     关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题 在win7 64位系统安装VC2015的编译器,并安装了 Qt 5.6 -5.7 VC2015 64位版本测 ...

  6. Gradle添加外部项目代码

    为了测试一些功能,我想在公司的项目中引进外部项目的子模块代码进来调试,试验了好半天终于成功了... 原来不需要导入代码,只要在settings.gradle中这样就好了: 然后就可以和原项目中的代码一 ...

  7. linux oracle 启动全过程

    一:启动oracle [root@ccoracle ~]# su -l oracle [oracle@ccoracle ~]$ sqlplus /nolog SQL*Plus: Release 10. ...

  8. hadoop之hive&hbase互操作

    大家都知道,hive的SQL操作非常方便,但是查询过程中需要启动MapReduce,无法做到实时响应. hbase是hadoop家族中的分布式数据库,与传统关系数据库不同,它底层采用列存储格式,扩展性 ...

  9. 打包成war包之后如何读取配置文件

    今天工作开发中遇到一个问题:在idea运行的项目读取配置文件没有问题,打包成war包之后就会报错java.io.FileNotFoundException: class path resource 原 ...

  10. python算法与数据结构-什么是数据结构

    一.什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式. 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值 ...