算法设计与分析实验
d[j]=temp;
}
path[1]=1;
path[k]=n;
for(j=2;j<k;j++)
path[j]=d[path[j-1]];
}
void bgraph(int bcost[],int path1[],int d[]) //使用向后递推算法求多段图的最短路径
{
int r,j,temp,min; //j是阶段r是顶点
实验名称
实验二贪心法作业调度
实验目的
掌握贪心算法的基本思想
掌握贪心算法的典型问题求解
进一步多级调度的基本思想和算法设计方法
学会用贪心法分析和解决实际问题
问题描述
设计贪心算法实现作业调度,要求按作业调度顺序输出作业序列。如已知n=8,效益p=(35, 30, 25, 20, 15, 10, 5, 1),时间期限d=(4, 2, 4, 5, 6, 4, 5, 7),求该条件下的最大效益。
min=c[j][temp]+cost[temp]; //初始化最小值
for(r=0;r<=n;r++)
{
if(c[j][r]!=MAX)
{
if((c[j][r]+cost[r])<min) //找到最小的r
{
min=c[j][r]+cost[r];
temp=r;
}
}
}
cost[j]=c[j][temp]+cost[temp];//cost的值
{
min=c[r][j]+bcost[r];
temp=r;
}
}
}
bcost[j]=c[temp][j]+bcost[temp]; //向后递推求的cost值
d[j]=temp; //向后递推求的d值
}
path1[1]=1;
path1[k]=n;
for(int i=4;i>=2;i--)
{
path1[i]=d[path1[i+1]];
实验环境
程序设计语言:c++
编程工具:microsoft visual studio 2010
程序代码
#include <iostream>
using namespace std;
void Greedy(int t[],int n,int m)
{
int work,machine;
int M[11];
实验环境
程序设计语言:c++
编程工具:microsoft visual studio 2010
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 8
void getData(int [], int);
void merge(int M[], int low, int high);
Greedy(t,n,m);
return 0;
}
运行结果
分析体会(复杂性分析&程序的优劣&改进)
贪心算法通过一系列的选择来得到一个问题的解。它所作的每一个选择都是当前状态下某种意义的最好选择。哈夫曼提出了一种构造哈夫曼前缀码的贪心算法,由此产生的编码方案称为哈夫曼算法。哈夫曼算法以自底向上的方式构造表示最优前缀码的二叉树T。算法以个叶结点开始,执行次的“合并”运算后产生最终所要求的树T。给定编码字符集C及其频率分布f,即C中任一字符c以频率f(c)在数据文件中出现。C的一个前缀码编码方案对应于一棵二叉树T。字符c在树T中的深度记为。也是字符c的前缀码长。
if (low >= high) break;
M[low++] = M[high];
while (low < high && M[low] <= part_element)
low++;
if (low >= high) break;
M[high--] = M[low];
}
M[high] = part_element;
{machine=j;}
}
M[machine]=M[machine]+t[work];
t[work]=0; //被选择过的机器时间调为0
cout<<"工作量为"<<work<<"机器效益为"<<machine<<endl;
}
}
int main() {
int t[]={41,67,34,10,69,24,78,58,62,64},n=10,m=5;//待分配的工作
for (j=0;j<k;j++)
if (x[j]==x[k]||abs(j-k)==abs(x[j]-x[k])) return 0;
return 1;}
void chessboard(){
int i,j;
int site[N];
printf("第%d种解法:\n",++sum);
for (i=0;i<N;i++){
printf("\n");
return 0;
}
void merge(int M[], int low, int high)
{
int middle;
if (low >= high) return;
middle = split(M, low, high);
merge(M, low, middle - 1);
实验环境
程序设计语言:c++
编程工具:microsoft visual studio 2010
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <iostream.h>
#define MAX 100
#define n 10 //顶点数
int split(int M[], int low, int high);
int main(void)
{
int M[N], i;
time_t t;
srand((unsigned) time(&t)); /*设置随机数起始值*/
getData(M, N); /*获得数据放入数组a中*/ printf("Unordered datas(排序前): ");
实验名称
实验四回溯法求n皇后问题
实验目的
1.掌握回溯算法的基本思想
2.通过n皇后问题求解熟悉回溯法
3.使用蒙特卡洛方法分析算法的复杂
问题描述
要求在一个8*8的棋盘上放置8个皇后,使得它们彼此不受“攻击”。两个皇后位于棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现在要找出使得棋盘上8个皇后互不攻击的布局。
本科实验报告
课程名称:算法设计与分析
实验项目:算法设计与分析实验
实验地点:行勉楼
专业班级:学号:
学生姓名:
指导教师:林福平
2016年4月20日
实验名称
实验一分治法合并排序
实验目的
掌握合并排序的基本思想
掌握合并排序的实现方法
学会分析算法的时间复杂度
学会用分治法解决实际问题
问题描述
随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组。
#define k 5 //段数
int c[n][n];
void init(int cost[]) //初始化图
{
int i,j;
for(i=0;i<1;j++)
{
c[i][j]=MAX; //依次建立表格
}
}
c[1][2]=4;
c[1][3]=3;
c[1][4]=3;
cout<<"输出使用向前递推算法后的最短路径:\n\n";
for(int i=1;i<=5;i++)
{
cout<<path[i]<<" ";
}
cout<<"\n";
cout<<endl<<"最短路径为长度:"<<cost[1]<<endl;
cout<<"\n";
cout<<"\n输出使用向后递推算法后的最短路径:\n\n";
实验环境
程序设计语言:c++
编程工具:microsoft visual studio 2010
程序代码
#include <stdio.h>
#include<math.h>
#define N 8
static int sum;
static int x[N];
int place(int k){
int j;
for (i = 0; i < N; i++)
printf("%d ", M[i]);
printf("\n");
merge(M, 0, N - 1);
printf("In sorted order(排序后): ");