【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 ...
随机推荐
- Win10《芒果TV》商店版跻身Windows商店《热门免费应用》前12强
2017立春上班的第一天,让人惊喜的好日子,春节过后,Win10<芒果TV>商店版跻身Windows商店<热门免费应用>前12强,露出尖尖头,这个来自广大用户和合作伙伴们一直以 ...
- 使用Newtonsoft.Json输出JSON
安装: Install-Package Newtonsoft.Json 代码: //序列化DataTable DataTable dt = new DataTable(); dt.Columns.Ad ...
- 领域驱动设计(DDD)的实践经验分享之ORM的思考
原文:领域驱动设计(DDD)的实践经验分享之ORM的思考 最近一直对DDD(Domain Driven Design)很感兴趣,于是去网上找了一些文章来看看,发现它确实是个好东西.于是我去买了两本关于 ...
- spring.net的简单使用(一)入门
Spring.net是一个非常强大的框架和工具,下面是百度百科对它的介绍. Spring.NET为建立企业级应用提供了一套轻量级的解决方案.通过Spring.NET,我们可以用统一且透明的方式来配置应 ...
- linux 系统中将数据写入文档不能立即保存问题的解决方法
应用场景: 设备跑的是Linux系统,与PC上位机进行通信,上位机可以给Linux发送设备配置信息,Linux将配置信息写入文件中以备设备断电重启时使用. bug现象: 设备正常运行,设备配置信息为A ...
- RapidJSON 1.0 正式版发布,C++的JSON开发包
分享 <关于我> 分享 [中文纪录片]互联网时代 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...
- Twitter的分布式自增ID算法snowflake(雪花算法) - C#版
概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的.有些时候我们希望能使用一种简 ...
- 文件文件夹混合多选对话框(修改GWL_WNDPROC)
/******************************************************************** created: 2008/07/22 created: 2 ...
- hdu4767_Bell_矩阵快速幂+中国剩余定理
2013长春赛区网络赛的1009题 比赛的时候这道题英勇的挂掉了,原因是写错了一个系数,有时候粗心比脑残更可怕 本题是关于Bell数,关于Bell数的详情请见维基:http://en.wikipedi ...
- pip升级到18.0版本过程中报错解决方法
我这台电脑是windows10系统,一般在cmd命令行界面下执行pip的升级命令:pip install –upgrade pip 安装的时候,会有拒绝访问报错:这个时候应该是权限的问题,于是在win ...