算法篇之回溯法
算法篇之回溯法
--细说回溯法(细说不是胡说)
算法篇之回溯法
前言
一、什么是回溯法
二、回溯法模型设计
三、常见的回溯算法的分类
1.有固定的起始点
2.任意一个元素都可作为起始点
四、回溯例题求解
1.素数环
2.排列组合
3.自然数的拆分
前言
最近因为复试的原因,对几个算法进行了一定程度的了解,这一篇将详细讲述一下回溯,让大家浅显易懂的明白回溯。
一、什么是回溯法
官方解释:回溯法是一个既带有系统性又带有跳跃性的搜索算法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。
通俗来讲:回溯思想其实就是试探思想,有时候我们需要得到问题的解,先从其中某一种情况进行试探,在试探的过程中,一旦发现原来的选择是错误的,那么就退回一步重新选择,然后继续向前试探,反复这样的过程直到求解出问题的解。
二、回溯法模型设计
回溯法一般都有固定的形式,下面给出一般形式
有多组测试数据,每组输入一个n(0
输出描述:
每组第一行输出对应的Case序号,从1开始。
如果存在满足题意叙述的素数环,从小到大输出。
否则输出No Answer。
样例输入:
6
8
3
0
样例输出:
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Case 3:
No Answer
第一行输入整数N(1
输出描述:
在1-n中选取m个字符进行全排列,按字典序全部输出,每种排列占一行,每组数据间不需分界。如样例
样例输入:
2
3 1
4 2
样例输出:
1
2
3
12
13
14
21
23
24
31
32
34
41
42
43
#include
#include
#define maxsize 10
using namespace std;
int a[maxsize];
int vis[maxsize]={0};
int sum=0;
int n,r;
void dfs(int cur)
{int i;if(cur==r+1){sum++;for(i=1;i>T;while(T--){cin>>n;cin>>r;dfs(1);}return 0;
}
3.自然数的拆分
/**
回溯之拆分自然数
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14
*/
#include
#define maxsize 100001
using namespace std;
int a[maxsize]={1};
int sum=0;
int n;void print(int cur)
{sum++;cout<>n;dfs(n,1);cout<<"sum="<
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
