无优先级问题.docx
《无优先级问题.docx》由会员分享,可在线阅读,更多相关《无优先级问题.docx(8页珍藏版)》请在冰豆网上搜索。
无优先级问题
皖西学院信息工程系
实验报告
姓名__王礼_学号
院系_信息工程系专业计算机科学与技术
年级2007级班级_0702班_
小组实验任务分工_独立完成
实验时间2010年_9_月20_日
实验名称无优先级运算问题
指导老师及职称苏守宝教授
皖西学院信息工程系
实验课程:
算法分析与设计
实验名称:
无优先级运算问题(综设型实验)
第一部分实验内容
1.实验目标
对于给定的n个正整数,设计一个优先队列式分支限界法用最少的无优先级运算次数产生整数m。
2.实验任务
(1)从所给定的题目中选择一题,使用分支限界法求解之。
(2)用文字来描述你的算法思路,包括解空间、限界函数、算法主要步骤等。
(3)在Windows环境下使用C/C++语言编程实现算法。
(4)记录运行结果,包括输入数据,问题解答及运行时间。
(5)分析算法最坏情况下时间复杂度和空间复杂度。
(6)谈谈实验后的感想,包括关于该问题或类似问题的求解算法的建议。
3.实验设备及环境
PC;C/C++等编程语言。
4.实验主要步骤
(1)根据实验目标,明确实验的具体任务;
(2)设计求解问题的算法,并编写程序实现算法;
(3)设计实验数据并运行程序、记录运行的结果;
(4)分析算法时空性能;
(5)实验后的心得体会。
第二部分问题及算法
1.问题描述:
给定n个正整数和4个运算符+,-,*,/,且运算符无优先级,如2+3×5=25。
对于任意给定的整数m,试设计一个算法,用以上给出的n个数和4个运算符,产生整数m,且用的运算次数最少。
给出的n个数中每个数最多只能用1次,但每种运算符可以任意使用
2.算法设计:
对于给定的n个正整数,设计一个算法,用最少的无优先级运算次数产生整数m。
3.数据输入
由文件input.txt给出输入数据。
第一行有两个正整数n和m。
第二行是给定的用于运算的n个正整数。
4.结果输出
将计算出的产生整数的m的最少无优先级运算次数以及最优无先级运算表达式输出到文件output.txt。
输入文件示例输出文件示例
Input.txtoutput.txt
5252
523672+3*5
第三部分实验结果与分析
1.实验数据及结果
2.实验分析及结论
针对该实验我做了仔细分析,刚看到这个题目,不知所云,后来分析后才知道,给定n个正整数和4个运算符+,-,*,/,且运算符无优先级,如2+3×5=25。
对于任意给定的整数m,试设计一个算法,用以上给出的n个数和4个运算符,产生整数m,且用的运算次数最少。
给出的n个数中每个数最多只能用1次,但每种运算符可以任意使用。
第四部分心得与展望
1.自我评价及心得体会
分析无优先级算法问题时候一开始有点无从下手,经过我查资料以后,再加上自己的分析和见解,以及老师的帮助,最终得出了答案,让我明白了只要自己从分利用自己掌握的技术和周边的坏境比如我们学校的老师,网络资源等,大多问题都可以解决的。
2.展望
对算法产生了浓厚的兴趣,打算以后可能会从事算法设计。
第五部分附录
1.源程序
#include
usingnamespacestd;
intk;
classreadin
{
friendintnreadin(intn,intm);
private:
boolfound();//found判断是否找到解
boolsearch(intt);
intn,m,x;
int*a;//给定的用于运算n个正整数的存放位置
int*num;//存放运算的产生整数m
int*operate;
int*flag;
char*ptr;//存储结果中的运符
};
//用迭代加深的回溯法
boolreadin:
:
search(intdepth)//depth:
递归深度
{
if(depth>k)
{
if(found())
returntrue;//判断结点是否满足件,即是否找到解
else
returnfalse;
}
else
for(inti=0;iif(flag[i]==0)
{
num[depth]=a[i];
flag[i]=1;
for(intj=0;j<4;j++)
{
operate[depth]=j;
if(search(depth+1))
returntrue;
}
flag[i]=0;
}
returnfalse;
}
boolreadin:
:
found()
{
intx=num[0];
for(inti=0;i{
switch(operate[i])
{
case0:
x+=num[i+1];ptr[i]='+';break;
case1:
x-=num[i+1];ptr[i]='-';break;
case2:
x*=num[i+1];ptr[i]='*';break;
case3:
x/=num[i+1];ptr[i]='/';break;
}
}
return(x==m);
}
//读入初始数据
intnreadin(intn,intm)
{
readinX;
int*a=newint[n];
int*num=newint[n];
int*operate=newint[n];
int*flag=newint[n];
char*ptr=newchar[n];
X.n=n;
X.m=m;
X.a=a;
X.operate=operate;
X.flag=flag;
X.num=num;
X.ptr=ptr;
cout<<"给定的用于运算的n个正整数:
"<for(inti=0;i{
cin>>a[i];
flag[i]=0;
}
cout<<"给定的运算结果整数m:
"<for(k=0;kif(X.search(0))
{
cout<<"计算的产生整数m的最少无优先级运算次数:
"<cout<cout<<"计算的产生整数m的最少无优先级运表达式:
"<for(i=0;i<=k;i++)
{
cout<}
cout<return0;
}
cout<<"NoSolution!
"<return0;
}
voidmain()
{
intn;
intm;
cout<<"输入给定的用于运算的n个正整数和给定的运算结果整数m:
"<cin>>n>>m;
nreadin(n,m);
system("pause");
}
参考文献
1.
2.余祥宣崔国华邹海明.计算机算法基础[M].武汉:
华中科技大学出版社,2005-10