回溯法——设计一个算法在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])
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的程序,并输出所有的可能性和全排列相关推荐
- 程序基本算法习题解析 设计一个算法,计算男女运动员最佳配对方案,使各组男女双方竞赛优势的总和达到最大。
题目: 羽毛球队有男女运动员各n人.给定2个n*n矩阵P和Q.P[i][j]是男运动员i和女运动员j,配对组成混合双打的男运动员竞赛优势,Q[i][j]是女运动员i和男运动员j配合的女运动员竞赛优势. ...
- 回溯法 -数据结构与算法
1.回溯法算法思想: 定义: 回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标.但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术 ...
- 随机产生10个整数;设计一个算法找其中的最大的元素和最小的元素,并统计元素之间的比较次数
随机产生10个整数;设计一个算法找其中的最大的元素和最小的元素,并统计元素之间的比较次数 选择排序法 #include <iostream> #include <cstdlib> ...
- 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来
题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...
- 重写0-1背包问题的回溯法,使算法能输出最优解
重写0-1背包问题的回溯法,使算法能输出最优解 样例: 4 7 3 9 5 10 2 7 1 4 输出: 20 分析:构建二叉树,每个物品只有拿和不拿两种情况, 时间复杂度为O(2^n). 不难, 深 ...
- 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底
问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...
- 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...
版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...
- 设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的)
设计一个算法,删除一个单链表L中元素值最大的结点(假设最大值结点是唯一的). #include <stdio.h> #include<malloc.h> typedef str ...
最新文章
- 透视大数据时代下的物联网生活
- 《HTML5触摸界面设计与开发》——导读
- C#反射设置属性值和获取属性值
- mac 终端 svn 命令
- 注册app短信验证平台_免费的短信验证码平台弊端竟然这么多!
- HandlerMethodArgumentResolver 参数解析器
- 浙江工商大学计算机学硕和专硕,谈谈一战浙工商会计专硕考研失败教训
- genymotion-安卓模拟器-IMEI修改方法
- JavaScript 判断是不是回文字符串
- 火星坐标系解密-iDesktopX空间数据处理
- 专业办公套件WPS Office 2020 for Mac
- 直线和直线,直线和圆,直线和矩形的交点
- java——配置环境变量
- 网络分层,图,易懂--对应 应用层、数据传输层、网络层、数据链路层
- 深入多线程九:守护线程(代码示例)
- vc6 在win10上编译x64程序的问题总结
- iOS 画板的简单实现
- 赋能5G移动市场:MediaTek发布新一代天玑旗舰
- 商品图片局部放大效果
- brew mysql workbench_mac安装mysql及workbench
热门文章
- python安装步骤-从0到1,Python安装步骤详解(附基础知识简介)!
- python怎么使用-Python中__all__作用何在以及如何使用?
- python软件下载安装百度网盘-Python自动化测试视频教程【百度云盘下载】
- python怎么读写文件-python读写文件
- python入门基础知识实例-Python入门,原来如此简单!
- 手机APP移动应用开发
- 谷歌称语音识别是下一个机会,尤其在发展中国家
- 科大讯飞/百度/阿里/腾讯(BAT)智能语音识别(ASR)性能对比选择预计价格分享 - pytorch中文网...
- c语言中eles后面分号的作用,C语言 if else 语句详细讲解
- element ui 邮箱非必填校验