算法设计与分析实验4报告(优选.)

合集下载

算法设计与分析实验报告

算法设计与分析实验报告

实验报告题目实验一递归与分治策略一、实验目的1.加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

二、实验内容设计一个递归和分治算法,找出数组的最大元素,找出x在数组A中出现的次数。

三、实验要求(1)用分治法求解…问题;(2)再选择自己熟悉的其它方法求解本问题;(3)上机实现所设计的所有算法;四、实验过程设计(算法设计过程)1.设计一个递归算法,找出数组的最大元素。

2.设计一个分治算法,找出x在数组A中出现的次数。

3.写一个主函数,调用上述算法。

五、实验结果分析(分析时空复杂性,设计测试用例及测试结果)时间复杂性:最好情况下,O(n)最坏情况下:O(nlog(n)空间复杂性分析:O(n)六、实验体会通过写递归与分治策略实验,更加清楚的知道它的运行机理,分治法解题的一般步骤:(1)分解,将要解决的问题划分成若干规模较小的同类问题;(2)求解,当子问题划分得足够小时,用较简单的方法解决;(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

做实验重在动手动脑,还是要多写写实验,才是硬道理。

七、附录:(源代码)#include"stdio.h"#define ElemType intint count(ElemType a[],int i,int j,ElemType x){int k=0,mid; //k用来计数,记录数组中x出现的次数if(i==j){if(a[i]==x) k++;return k;}else{mid=(i+j)/2;k+=count(a,i,mid,x);k+=count(a,mid+1,j,x);}return k;}ElemType Maxitem(ElemType a[],int n){ElemType max=a[n-1],j;if(n==1){max=a[n-1];return max;}else{j=Maxitem(a,n-1);if(j>max) max=j;return max;}}void main(void){ElemType a[]={1,5,2,7,3,7,4,8,9,5,4,544,2,4,123};ElemType b;ElemType x;int n;b=Maxitem(a,15);printf("数组的最大元素为%d\n",b);printf("输入想要计数的数组元素:\n");scanf("%d",&x);n=count(a,0,14,x);printf("%d在数组中出现的次数为%d次\n",x,n);}实验二动态规划——求解最优问题一、实验目的1.加深学生对动态规划算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2.提高学生利用课堂所学知识解决实际问题的能力;3.提高学生综合应用所学知识解决实际问题的能力。

算法设计与分析实验报告

算法设计与分析实验报告

实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。

三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。

如果a>b则交换位置,如果a<b则不交换。

四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。

二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。

递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。

本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。

一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。

在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。

通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。

二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。

在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。

我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。

三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。

在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。

我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。

四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。

在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。

我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。

五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。

在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。

在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。

在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。

《算法设计与分析》实验四_实验报告电子版

《算法设计与分析》实验四_实验报告电子版

学号09710118《算法设计与分析》实验报告四学生姓名范振山专业、班级09计算机一班指导教师唐国峰成绩电子与信息工程系2012 年4 月6 日实验四:贪心算法运用练习一、实验目的本次实验是针对贪心算法的设计及应用练习,旨在加深学生对该部分知识点的理解,提高学生运用该部分知识解决问题的能力。

二、实验步骤与要求1.实验前复习课程所学知识以及阅读和理解指定的课外阅读材料;2.学生独自完成实验指定内容;3.实验结束后,用统一的实验报告模板编写实验报告。

4.提交说明:(1)电子版提交说明:a 需要提交Winrar压缩包,文件名为“《算法设计与分析》实验四_学号_姓名”,如“《算法设计与分析》实验四_09290101_张三”。

b 压缩包内为一个“《算法设计与分析》实验四_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“实验报告电子版”。

其下分别放置对应实验成果物。

(2)打印版提交说明:a 不可随意更改模板样式。

b 字体:中文为宋体,大小为10号字,英文为Time New Roman,大小为10号字。

c 行间距:单倍行距。

(3)提交截止时间:2012年4月20日16:00。

三、实验项目请从下列题目列表中任选2道或3道题目,运用贪心算法对问题的进行求解。

备选题目列表如下:1.教材第106页所记述的0-1背包问题。

2.教材课后习题4-9;3.教材课后习题4-21。

四、实验过程(一)题目一:给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为c。

问如何选择装入背包中的物品,使得装入背包中物品的总价值最大?1.题目分析给定c>0;wi>0;vo>0,1≤i≤n,要求找出一个n元0-1向量(x1,x2,……xn),xi∈{0,1},1≤i ≤n,使得∑wixi≤c,而且∑vixi达到最大。

2.算法构造首先计算每种物品单位重量的价值vi.wi;然后,依贪心算法策略,将尽可能多的单位重量价值最高的物品装入背包。

算法设计与分析实验报告

算法设计与分析实验报告
V[i][j]=V[i-1][j-W[i]]+P[i];
}
}
//回溯法求取最优解
void Traceback(int X[],int *W,int V[N][C],int n,int c)
{
int i,cu=c;
for(i=n;i>0;i--)
{
if(V[i][cu]==V[i-1][cu])
X[i]=0;
for(int i=1;i<=n;i++) //依次输入物品价值
cin>>v[i];
for(int i=1;i<=n;i++) //初始化物品放入量
X[i]=0;
float vs[N];
for(int i=1;i<=n;i++)
vs[i]=v[i]/s[i];
sort(s,v,vs,n); //按物品价值体积比从大到小排序
float s[N],v[N],X[N],totalv=0;
cout<<"请输入物品个数和背包容积:";
cin>>n>>c;
float cu=c;
cout<<"请依次输入物品体积:";
for(int i=1;i<=n;i++) //依次输入物品体积
cin>>s[i];
cout<<"请依次输入物品价值:";
cout<<v[i]<<" ";
cout<<endl;
cout<<"排序后物品价值体积比:";

计算机算法设计与分析实验报告

计算机算法设计与分析实验报告

计算机算法设计与分析实验报告专业:java 技术学号:541213440245 姓名:徐亚涛指导老师:谷培培实验一:棋盘覆盖(递归与分治策略)一、实验目的与要求1、明确棋盘覆盖的概念2、明确递归与分治策略的设计思路。

3、利用递归与分治策略解决棋盘覆盖问题。

二、实验题:问题描述:递归与分治策略算法,用4种不同形态的L型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入数据由程序运行后的界面中的编辑框中输入游戏规模,特殊方格的位置。

将覆盖的结果在窗口中显示出来。

三、实验代码package cn.ChessBoard;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JTextArea;import javax.swing.JTextField;public class ChessBoards extends JFrame {private int tr, tc, dr, dc, size;//定义各成员变量int tile = 1;float red,green,blue;JPanel centerPanel;JPanel southPanel;JButton[][] button;JTextField TrText, TcText, DrText, DcText, SizeText;JLabel TrLabel, TcLabel, DrLabel, DcLabel, SizeLabel;JButton OKButton;JButton CancelButton;JPanel panel = new JPanel();public ChessBoards() {super();setTitle("棋盘覆盖");this.setResizable(false);centerPanel = new JPanel();southPanel = new JPanel();OKButton = new JButton("确定或开始");OKButton.addActionListener(new OKButtonAction()); CancelButton = new JButton("取消或清除"); CancelButton.addActionListener(new OKButtonAction()); setBounds(300, -10, 900, 900);//设置窗口大小与位置TrText = new JTextField("0",2);//定义各组件TcText = new JTextField("0",2);DrText = new JTextField("0",2);DcText = new JTextField("0",2);SizeText = new JTextField("4",2);TrLabel = new JLabel("起始方格坐标x: ");TcLabel = new JLabel("起始方格坐标y: "); DrLabel = new JLabel("特殊方格坐标x: "); DcLabel = new JLabel("特殊方格坐标y: "); SizeLabel = new JLabel("棋盘规模size: ");TrText.setEnabled(false);TcText.setEnabled(false);int tR = Integer.parseInt(TrText.getText());int tC = Integer.parseInt(TcText.getText());int dR = Integer.parseInt(DrText.getText());int dC = Integer.parseInt(DcText.getText());int Size = 1;for (int i=0;i<Integer.parseInt(SizeText.getText());i++) Size*=2;tr = tR;tc = tC;dr = dR;dc = dC;size = Size;southPanel.add(CancelButton);//添加各组件到窗体southPanel.add(TrLabel);southPanel.add(TrText);southPanel.add(TcLabel);southPanel.add(TcText);southPanel.add(DrLabel);southPanel.add(DrText);southPanel.add(DcLabel);southPanel.add(DcText);southPanel.add(SizeLabel);southPanel.add(SizeText);southPanel.add(OKButton);getContentPane().add(southPanel, BorderLayout.NORTH);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}class gridLayout {public gridLayout() {centerPanel.setLayout(new GridLayout(0, size));button = new JButton[size][size];for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {button[i][j] = new JButton();if (i == dr && j == dc) {button[i][j].setBackground(Color.BLUE);button[i][j].setText("<html><font size='2' color='white'>棋盘覆盖<br>Done By Java!</font></html>");button[i][j].setEnabled(false);}centerPanel.add(button[i][j]);}}}private void sleep(){for (int i=0;i<100;i++)for(int j=0;j<1000;j++);}public void ChessBoard(int tr, int tc, int dr, int dc, int size) {//算法实现if (size == 1) // 棋盘方格大小为1,说明递归到最里层return;int t = tile++;// 每次递增1Random rd = new Random();red=rd.nextFloat();green=rd.nextFloat();blue=rd.nextFloat();Color col = new Color(red,green,blue);sleep();int s = size / 2; // 棋盘中间的行、列号(相等的)// 检查特殊方块是否在左上角子棋盘中if (dr < tr + s && dc < tc + s) // 在ChessBoard(tr, tc, dr, dc, s);else // 不在,将该子棋盘右下角的方块视为特殊方块{button[tr + s - 1][tc + s - 1].setBackground(col);button[tr + s - 1][tc + s - 1].setEnabled(false);button[tr + s - 1][tc + s - 1].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);sleep();}// 检查特殊方块是否在右上角子棋盘中if (dr < tr + s && dc >= tc + s) // 在ChessBoard(tr, tc + s, dr, dc, s);else // 不在,将该子棋盘左下角的方块视为特殊方块{button[tr + s - 1][tc + s].setBackground(col);button[tr + s - 1][tc + s].setEnabled(false);button[tr + s - 1][tc + s ].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);sleep();}// 检查特殊方块是否在左下角子棋盘中if (dr >= tr + s && dc < tc + s) // 在ChessBoard(tr + s, tc, dr, dc, s);else // 不在,将该子棋盘右上角的方块视为特殊方块{button[tr + s][tc + s - 1].setBackground(col);button[tr + s][tc + s - 1].setEnabled(false);button[tr + s ][tc + s - 1].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);sleep();}// 检查特殊方块是否在右下角子棋盘中if (dr >= tr + s && dc >= tc + s) // 在ChessBoard(tr + s, tc + s, dr, dc, s);else // 不在,将该子棋盘左上角的方块视为特殊方块{button[tr + s][tc + s].setBackground(col);button[tr + s][tc + s].setEnabled(false);button[tr + s ][tc + s ].setText("<html><Font size='4',color='white'>"+t+"</Font></html>");ChessBoard(tr + s, tc + s, tr + s, tc + s, s);sleep();}}}public class OKButtonAction implements ActionListener {public void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton whichButton = (JButton) e.getSource();String whichName = whichButton.getActionCommand();if(whichName.equals("开始")) {getContentPane().add(centerPanel, BorderLayout.CENTER);int tR = Integer.parseInt(TrText.getText());int tC = Integer.parseInt(TcText.getText());int dR = Integer.parseInt(DrText.getText());int dC = Integer.parseInt(DcText.getText());int Size = 1;for (int i=0;i<Integer.parseInt(SizeText.getText());i++)Size*=2;tr = tR;tc = tC;dr = dR;dc = dC;size = Size;try {gridLayout grid = new gridLayout();grid.ChessBoard(tr, tc, dr, dc, size);centerPanel.updateUI();} catch (Exception EX) {EX.printStackTrace();}panel.removeAll();OKButton.setEnabled(false);}if (whichName.equals("取消或清除")) {//当你点下一个提示按钮时的事件响应JLabel label = new JLabel();label.setHorizontalAlignment(JLabel.CENTER);label.setText("<html><Font size='+8',color='red'><center><b><br> 您取消了操作或是<br><Font size='+8',color='blue'><center>您清除了前一个棋盘……" +"<br><Font size='+8',color='green'><center>下面是关于题目的介绍<br><br><br><br><br><br> </b></Font></html>");// JLabel l = new JLabel("题目要求");JTextArea area = new JTextArea("在一个2k x 2k 个方格组成的棋盘中,恰有一个方格与其他方格不同," +"称该方格为一特殊方格,且称该棋盘为一特殊棋盘。

算法设计与分析实验报告

算法设计与分析实验报告
定义如下标识符:
ቤተ መጻሕፍቲ ባይዱCost(L)=+
Cost(R)=+
如果用W(i,j)表示Q(i)+的和,于是可以得到检索树T的预期成本是:
P(k)+Cost(L)+Cost(R)+W(0.k-1)+W(k,n),
如果T是最优的,则上式必定为最小值。则必须有Cost(L)=C(0,k-1)和Cost(R)=C(k,n),而且k应该选择使得P(k)+ C(0,k-1)+ C(k,n)+W(0,k-1)+W(k,n)最下的k值。
2.最优二分检索树问题设计分析
已知一个固定的标识符集合,希望产生一个构造二分检索树的方法。可以预料,同一个标识符集合有不同的二分检索树,而不同的二分检索树有不用的性能特征。由于一般的检索树具有不同的概率,另外,也要做一些不成功的检索,即对不在这棵树中标识符的检索。假定给出的标识符集合为{},其中,设P(i)是对 的检索概率,Q(i)是正被检索的标识符X的概率,而标识符X满足 <X<,1<=i<=n,那么就是不成功的概率。明显的有=1.
算法设计与分析实验报告
山东技术科技学院
一、
1.掌握贪心方法、动态规划的基本思想
2.了解适用贪心方法、动态规划的问题类型,并能设计相应的贪心法算法
3.掌握贪心算法、动态规划算法时间空间复杂度分析,以及问题复杂性分析方法
二、
1.实现单源点生成最短路径的贪心方法,完善算法,求出长度,并推导路径上的结点序列
1
主函数main
FindWays()函数流程图
Ni=n
Y
Length=0
Y
N
1
2.

《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告

《算法设计与分析》课程实验报告实验序号:实验项目名称:随机化算法一、实验题目1.N后问题问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后,任何两个皇后不放在同一行同一列,同一斜线上,问有多少种放法。

2.主元素问题问题描述:设A是含有n个元素的数组,如果元素x在A中出现的次数大于n/2,则称x是A的主元素。

给出一个算法,判断A中是否存在主元素。

二、实验目的(1)通过N后问题的实现,体会拉斯维加斯随机算法的随机特点:运行次数随机但有界,找到的解一定为正确解。

但某次运行可能找不到解。

(2)通过实现主元素的不同算法,了解蒙特卡罗算法的随机特性:对于偏真的蒙特卡罗算法,找到为真的解一定是正确解;但非真的解以高概率给出解的正确率------即算法找到的非真解以小概率出现错误。

同时体会确定性算法与随机化算法的差异及各自的优缺点。

(3)通过跳跃表的实现,体会算法设计的运用的广泛性,算法设计的思想及技巧不拘泥独立问题的解决,而在任何需要计算机解决的问题中,都能通过算法设计的技巧(无论是确定性还是随机化算法)来灵巧地解决问题。

此实验表明,通过算法设计技巧与数据组织的有机结合,能够设计出高效的数据结构。

三、实验要求(1)N后问题分别以纯拉斯维加斯算法及拉斯维加斯算法+回溯法混合实现。

要求对同一组测试数据,完成如下任务a.输出纯拉斯维加斯算法找到解的运行次数及运行时间。

b.输出混合算法的stopVegas值及运行时间c.比较a、b的结果并分析N后问题的适用情况。

(2)主元素问题,要求对同一组测试数据,完成如下任务:a.若元素可以比较大小,请实现O(n )的确定性算法,并输出其运行时间。

b.(选做题)若元素不可以比较大小,只能比较相同否,请实现O(n) 确性算法,并输出其运行时间。

c.实现蒙特卡罗算法,并输出其运行次数及时间。

d.比较确定性算法与蒙特卡罗算法的性能,分析每种方法的优缺点。

(3)参照教材实现跳跃表(有序)及基本操作:插入一个结点,删除一个结点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
t+=M[x[i]][i];
if(t>bestf)
{
bestf=t;
for(int j=1;j<=n;j++)
bestx[j]=x[j];
}
}
else
{
for(int j=i; j<=n; j++) //自i后,有[i:n]项作业
{
Swap(x[i],x[j]); //x[j]成为第i个作业
Backtrack(i+1);
ss>>M[i][j]; //从流中读取一个T类型的数赋给M
}
}
class Flowshop
{
friend int Flow(int **,int,int []);
private:
void Backtrack(int i);
int **M; //各作业所需的处理时间
int *x; //当前位置安排
int *bestx; //当前最优攻击力
void Swap(Type &a,Type &b)
{
Type t=b;
b=a;
a=t;
}
template<typename Type> //创建二维数组
void TwoDimArray(Type** &p,int r,int c)
{
p=new Type *[r];
for(int i=0; i<r; i++)
int *f2; //机器2完成处理时间
int f1; //机器1完成处理时间
int f; //当前攻击力
int bestf; //当前最优值
int n; //角色
};
void Flowshop::Backtrack(int i)
{
if(i>n)
{
int t=0;
for(int i=1; i<=n; i++)
Main.cpp
#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdlib>
#define INT_MAX 90
using namespace std;
template<typename Type> //交换两个变量的值
实验内容:
1.排兵布阵问题
某游戏中,不同的兵种处在不同的地形上其攻击能力不一样,现有n个不同兵种的角色{1,2,...,n},需安排在某战区n个点上,角色i在j点上的攻击力为Aij。试设计一个布阵方案,使总的攻击力最大。
数据:
防卫点
角色
1
2
3
4
5
1
60
40
80
50
60
2
90
60
80
70
20
3
30
50
40
50
80
4
90
40
30
70
90
5
60
80
90
60
50
2. 0-1背包问题(选做)
编程实现0-1背包问题的回溯算法。
数据文件见附件。
实验要求:
1.实验报告只写实验⑴。
2.写出算法思想、主要程序代码、算法复杂性分析。
实验(1)的步骤、算法及运行结果:
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。这种方法适用于解一些组合数相当大的问题。
最新文件----------------仅供参考--------------------已改成-----------word文本---------------------方便更改
赠人玫瑰,手留余香。
湖南科技学院实验报告
系部
数学与计算科学
专业
信息与计算科学
成绩评定
班级
信计0902班
学号
200905002231
int bestf;
TwoDimArray(M,5,5);
X.x=new int[n+1];
X.M=M;
X.n=n;
X.bestx=new int[n+1];
X.bestf=0;
int s=Flow(M,n,bestf);
cout<<s<<endl;
Print1(bestx,5);
return 0;
p[i]=new Type[c];
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
p[i][j]=0;
}
template<typename Type> //输出一维数组的元素
void Prin; i<=n; i++)
赠人玫瑰,手留余香。
{
cerr<<"文件打开失败!"<<endl;
exit(1); //结束程序
}
string s;
for(int i=0; i<r; ++i) //读取矩阵数据
{
getline(infile,s); //读一行
istringstream ss(s); //创建字符串流ss
for(int j=0; j<c; ++j)
X.f=0;
for(int i=0; i<=n; i++)
{
X.f2[i]=0;
X.x[i]=i;
}
X.Backtrack(1);
delete[] X.x;
delete[] X.f2;
return X.bestf;
}
int main()
{
Flowshop X;
int **M;
int n;
int *bestx;
回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。
2.回溯法的实现。
打开Codeblocks10.05,编辑头文件Queue.h和主程序main.cpp,利用参考程序,同时还设计了从文件读入数据,使程序更清晰,其主要程序如下:
}
运行结果:
实验总结
今天主要学的是回溯法,由于上一次实验老师要求我们从文件输入数据,因此这一次我同样利用了该种方式,将矩阵中的数据仍从文件输入,还挺好上手的,但是本该顺畅的实验过程中却出现了一个笨错误,就是我的程序调试总是不正确,我还想着明明就和别人的差不多,不应该啊~但是别的同学都可以运行了,我很纠结,又反复看了很多遍,后面才知道是头文件的引用不正确,我汗!改好头文件,程序一下子就顺利运行了,有种山重水复疑无路的感觉,虽然那个错误很白痴~额~
cout<<a[i]<<' ';
cout<<endl;
}
template<typename T>
void InputData2(T **M,int r,int c,char *filename)
{
ifstream infile;
infile.open(filename); //打开文件
if(!infile) //测试是否已经成功地打开了文件
Swap(x[i],x[j]);
}
}
}
int Flow(int **M,int n,int bestx[])
{
Flowshop X;//初始X对象的数据
X.x=new int[n+1];
X.f2=new int[n+1];
X.M=M;
X.n=n;
X.bestx=bestx;
X.bestf=0;
X.f1=0;
最后是算法时间复杂度分析,因为算法Backtrack在每个结点处耗费O(1)计算时间,故最坏情况下,整个算法的时间复杂性为O(n!)
最新文件----------------仅供参考--------------------已改成-----------word文本---------------------方便更改
姓名
易丹
课程名称
算法设计与分析
实验时间
2012.5.18
实验编号
实验四
实验名称
回溯法
实验环境
D315、一台电脑、Codeblocks10.05
实验目的
1.理解回溯法的深度优先搜索策略。
2.掌握用回溯法解题的算法框架。
3.掌握回溯法的设计策略。
实验内容(①算法、程序、步骤和方法②输入、输出、实验结果③实验结果分析)
相关文档
最新文档