回溯法
Serendipity_筱楠
当你的才华还撑不起你的野心的时,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来历练。
展开
-
回溯法 —— 判断子集和问题是否存在解
判断子集和问题是否存在解分析思路:采用回溯法针对问题存在解时求出相应的一个或多个解,或者最优解。如果需要判断问题是否存在解(一个或者多个),可以将求解函数改为bool型,当找到任何一个解时返回true,否则返回false,但当问题没有解时需要搜索所有空间。法一代码:#include<stdio.h>#define MAXN 20int n=4,W;int w[]={0,11,13,24,7}; //存放所有整数解,不用下标为0的元素bool dfs(int tw,int rw原创 2020-09-25 20:26:25 · 1112 阅读 · 0 评论 -
回溯法 —— 求解子集和问题
求解子集和问题的解题目描述:给定有n个不同正整数的集合w=(w1,w2,… ,wn)和一个正数W,要求找出w的子集s,式该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)分析思路:n=4时,解空间树如图(结点中的数字是结点的编号,例如结点18对应解向量为(1,1,0,1),选择的整数和=11+13+7=31),从i层到i+1层(1<=i<=n)的每一条边标有xi的值,xi或者为1或者为0,xi为1时表示取原创 2020-09-25 19:54:16 · 22032 阅读 · 2 评论 -
回溯法 —— 求解0/1背包问题(剪枝)
0/1背包问题题目描述:有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。分析思路:回溯法设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[原创 2020-09-25 09:45:32 · 16669 阅读 · 8 评论 -
回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列
回溯法题目描述:设计一个算法在1、2、3… 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如1+2+34-5+67-8+9=100分析思路:用数组a存放1 ~ 9的整数,用字符数组op存放插入的运算符,op[i]表示在a[i]之前插入的运算符。采用回溯法产生和为100的表达式,op[i]只能取+、- 或者空格。设计函数fun(op,sum,prevadd,a,i)sum:记录考虑整数a[i]时前面表达式计算的整数和(初始值为a[0])原创 2020-09-20 17:22:31 · 3847 阅读 · 2 评论 -
回溯法 —— 算法框架及应用
回溯法:思想:走不通退回走别的路在包含问题的所有解的空间树中,按照深度优先搜索策略,从根节点出发搜索解空间树。活结点:自身已生成但其孩子结点没有全部生成的结点扩展结点:指正在产生孩子结点的结点,E结点死结点:指其所有结点均已产生的节点首先根节点成为活结点,同时也成为当前的扩展结点在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。如果在当前扩展结点处不能在向纵深方向移动,则当前扩展结点就成为死结点。此时应往回移动(回溯)至最近的一个活结点处,并使这原创 2020-09-19 19:45:10 · 4211 阅读 · 0 评论