回溯法

题目描述:

设计一个算法在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])
prevadd:记录前面表达式中的一个数值(初始值为a[0])
i:从1开始到8结束,若sum=100,得到一个解

代码:

#include<stdio.h>
#define N 9
void fun(char op[],int sum,int prevadd,int a[],int i){if(i==N)   //扫描完所有位置{if(sum==100)  //找到一个解{ printf(" %d",a[0]); //输出解for(int j=1;j<N;j++){if(op[j]!=' ')printf("%c",op[j]);printf("%d",a[j]);} printf("=100\n");} return;} op[i]='+';  //位置i插入+ sum+=a[i];   //计算结果 fun(op,sum,a[i],a,i+1);  //继续处理下一个位置sum-=a[i];   //回溯op[i]='-';   //位置i插入-sum-=a[i];  //计算结果fun(op,sum,-a[i],a,i+1);  //继续处理下一个位置sum+=a[i];  //回溯op[i]=' ';    //在位置i插入‘’sum-=prevadd;  //先减去前面的元素值int tmp;   //计算新元素值if(prevadd>0)tmp=prevadd*10+a[i];   //如prevadd=5,a[i]=6,结果为56elsetmp=prevadd*10-a[i];   //如prevadd=-5,a[i]=6,结果为-56sum+=tmp;    //计算合并结果fun(op,sum,tmp,a,i+1);  //继续处理下一个位置sum-=tmp;   //回溯到sum sum+=prevadd;
}
void main(){int a[N];char op[N];   //op[i]表示在位置i插入运算符 for(int i=0;i<N;i++)   //将a赋值为1、2、...9a[i]=i+1;printf("求解结果\n");fun(op,a[0],a[0],a,1);  //插入位置i从1开始
}

  • 2.解空间为排列数

解空间为排列数的递归回溯框架

int X[n]; //X存放解向量,并初始化
void backtrack(int i)   //求解排列数的递归框架
{if(i>n)   //搜索到叶子结点,输出一个可行解 输出结果; else{for(j=i;j<=n;j++)  //用j枚举i的所有可能路径 {...   //第i层的节点选择X[j]的操作swap(X[i],X[j]);   //为保证排列中每个元素不同,通过交换实现if(constrain(i)&&bound(i))backtrace(i+1);  //满足约束条件和限界函数,进入下一层swap(x[i],x[j]);   //恢复状态...   //第i层的节点选择x[j]的恢复操作 }}
}

问题描述:

在一个含有n个整数的数组a,所有元素均不相同,求其所有元素的全排列。
例:a[]={1,2,3},
得到的结果是(1,2,3)、(1,3,2)、(2,3,1)、(2,1,3)、(3,1,2)、(3,2,1)

采用递归回溯法——递归模型f(a,n,i)

f(a,n,i) 输出产生的解     若i=n
f(a,n,i) 对于j=i~n-1:a[i]与a[j]交换位置;  其他情况f(a,n,i+1);将a[i]与a[j]交换位置(恢复环境)

例:a[]={1,2,3},

代码:

#include<stdio.h>
void swap(int &x,int &y)   //交换x、y
{int tmp=x;x=y;y=tmp;} void dispsolution(int a[],int n){  //输出一个解printf("(");for(int i=0;i<n-1;i++)printf("%d, ",a[i]);printf("%d)",a[n-1]); }void dfs(int a[],int n,int i)   //求a[0 ... n-1]的全排列{if(i>=n)   //递归出口dispsolution(a,n);else{for(int j=i;j<n;j++){swap(a[i],a[j]);  //交换a[i]与a[j]dfs(a,n,i+1);swap(a[i],a[j]);  //交换a[i]与a[j] }} } int main(){int a[]={1,2,3};int n=sizeof(a)/sizeof(a[0]);printf("a的全排列\n");dfs(a,n,0);printf("\n");}

回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列相关推荐

  1. 程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。

    题目: 羽毛球队有男女运动员各n人.给定2个n*n矩阵P和Q.P[i][j]是男运动员i和女运动员j,配对组成混合双打的男运动员竞赛优势,Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...

  2. 回溯法 -数据结构与算法

    1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术 ...

  3. 随机产生10个整数;设计一个算法找其中的最大的元素和最小的元素,并统计元素之间的比较次数

    随机产生10个整数;设计一个算法找其中的最大的元素和最小的元素,并统计元素之间的比较次数 选择排序法 #include <iostream> #include <cstdlib> ...

  4. 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来

    题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...

  5. 重写0-1背包问题的回溯法,使算法能输出最优解

    重写0-1背包问题的回溯法,使算法能输出最优解 样例: 4 7 3 9 5 10 2 7 1 4 输出: 20 分析:构建二叉树,每个物品只有拿和不拿两种情况, 时间复杂度为O(2^n). 不难, 深 ...

  6. 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底

    问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...

  7. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  8. 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...

    版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...

  9. 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)

    设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...

最新文章

  1. 透视大数据时代下的物联网生活
  2. 《HTML5触摸界面设计与开发》——导读
  3. C#反射设置属性值和获取属性值
  4. mac 终端 svn 命令
  5. 注册app短信验证平台_免费的短信验证码平台弊端竟然这么多!
  6. HandlerMethodArgumentResolver 参数解析器
  7. 浙江工商大学计算机学硕和专硕,谈谈一战浙工商会计专硕考研失败教训
  8. genymotion-安卓模拟器-IMEI修改方法
  9. JavaScript 判断是不是回文字符串
  10. 火星坐标系解密-iDesktopX空间数据处理
  11. 专业办公套件WPS Office 2020 for Mac
  12. 直线和直线,直线和圆,直线和矩形的交点
  13. java——配置环境变量
  14. 网络分层,图,易懂--对应 应用层、数据传输层、网络层、数据链路层
  15. 深入多线程九:守护线程(代码示例)
  16. vc6 在win10上编译x64程序的问题总结
  17. iOS 画板的简单实现
  18. 赋能5G移动市场:MediaTek发布新一代天玑旗舰
  19. 商品图片局部放大效果
  20. brew mysql workbench_mac安装mysql及workbench

热门文章

  1. python安装步骤-从0到1,Python安装步骤详解(附基础知识简介)!
  2. python怎么使用-Python中__all__作用何在以及如何使用?
  3. python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
  4. python怎么读写文件-python读写文件
  5. python入门基础知识实例-Python入门,原来如此简单!
  6. 手机APP移动应用开发
  7. 谷歌称语音识别是下一个机会,尤其在发展中国家
  8. 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...
  9. c语言中eles后面分号的作用,C语言 if else 语句详细讲解
  10. element ui 邮箱非必填校验