实验二 动态规划算法

实验二 动态规划算法
实验二 动态规划算法

《算法设计与分析》

实验二

专业班级网络08-1班

学号08083724

姓名刘航

实验二动态规划算法

一、实验目的与要求

1、熟悉最长公共子序列问题的算法;

2、初步掌握动态规划算法;

二、实验题

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。

给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。

三、实验代码

#include

#include

using namespace std;

int i=0,j=0;

int main(){

string s1,s2,r;

cout<<"输入两字符串"<

cin>>s1;

cin>>s2;

string subSequence(string,string);

r=subSequence(s1,s2);

cout<<"最大公共子串:";

cout<

return 0;

}

string max(string s1,string s2){

if(s1.size()>=s2.size()) return s1;

else return s2;

}

string subSequence(string s1,string s2){

while(s1[i]!='\0'){

i++;

}

while(s2[j]!='\0'){

j++;

}

if(i>0) i--;

if(j>0) j--;

string s;

if(s1[0]=='\0') return "";

if(s2[0]=='\0') return "";

if(s1[i]==s2[j]){

s=s1[i];

s1[i]='\0';

s2[j]='\0';

return subSequence(s1,s2)+s;

}

if(s1[i]!=s2[j]){

string s3=s1;

s3[i]='\0';

string s4=s2;

s4[j]='\0';

return max(subSequence(s1,s4),subSequence(s3,s2));

}

}

四、运行结果

五、实验小结

通过本实验,熟悉了最长公共子序列问题的算法,完成了实验内容,对字符串的使用有了进一步的了解,但是基本上那个都是从书上照抄下来的,自己的理解不多,所以要课后多多加深印象.

一、实验目的与要求

1、熟悉最长最大字段和问题的算法;

2、进一步掌握动态规划算法;

二、实验题

若给定n个整数组成的序列a1,a2,a3,……a n,求该序列形如a i+a i+1+……+a n的最大值。

三、实验代码

#include

#define MAX 20

using namespace std;

int a[MAX],b[MAX];

int n,sum;

int MaxSum()

{

sum=0;b[1]=a[0];

for(int j=1;j<=n;j++)

{

if(b[j-1]<=0)b[j]=a[j];

else b[j]=b[j-1]+a[j];

}

for(j=1;j<=n;j++)

if(sum

return sum;

}

void main()

{

cout<<"请输入数组个数:"<

cin>>n;

cout<<"请依次输入数组元素:"<

for(int i=0;i

cin>>a[i];

MaxSum();

cout<<"结果为:"<

}

四、运行结果

五、实验小结

通过本实验,熟悉最长最大字段和问题的算法,但是没有很好的完成实验。调试时,存在很多问题,自己很困惑,通过查书和同学老师的询问终于解决了问题.自己还要努力

动态规划实验报告

华东师范大学计算机科学技术系上机实践报告 一、 内容与设计思想 1.对于以下5 个矩阵: M 1: 2?3, M 2: 3?6, M 3: 6?4, M 4: 4?2, M 5: 2?7 , (a) 找出这5个矩阵相乘需要的最小数量乘法的次数。 (b) 请给出一个括号化表达式,使在这种次序下达到乘法的次数最少。 输入: 第一行为正整数N,表示有N 组测试数据; 每组测试数据的第一行为n,表示有n 个矩阵,2<=n<=50; 接下去的n 行,每行有两个整数x 和y,表示第ni 个矩阵是x*y 的。 输出: 对行每组数据,输出一行,每行一个整数,最小的矩阵连乘积。 我们保证输出的结果在2^64之内。 基本思想: 对于n 个矩阵的连乘积,设其不同的计算次序为P(n)。 由于每种加括号方式都可以分解为两个子矩阵的加括号问题:(A1...Ak)(Ak+1…An)可以得到关于P(n)的递推式如下: 2.定义0/1/2背包问题为:}x p max{n 1i i i ∑=。限制条件为:c x w n 1i i i ≤∑=,且 n i 1},2,1,0{x i ≤≤∈。设f(i , y)表示剩余容量为y ,剩余物品为:i ,i+1,…,n 时的最优解的值。 1.)给出f(i , y)的递推表达式; 2.)请设计求解f(i , y)的算法,并实现你的算法; 3.)设W=[10,20,15,30],P=[6,10,15,18],c=48,请用你的算法求解。 输入: 第一行为一个正整数N ,表示有几组测试数据。 每组测试数据的第一行为两个整数n 和M ,0=-=∑-=

动态规划算法实验

一、实验目的 (2) 二、实验内容 (2) 三、实验步骤 (3) 四.程序调试及运行结果分析 (5) 附录:程序清单(程序过长,可附主要部分) (7)

实验四动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 题目二:最长单调递增子序列问题(课本184页例28) 设有由n个不相同的整数组成的数列,记为:a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j) 若存在i1

题目三 0-1背包问题 给定n种物品和一个背包。物品i的重量是wi,其价值为vi,背包的容量为c,。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,,物品的个数n。接下来的n 行表示n个物品的重量和价值。输出为最大的总价值。 输入样例: 20 3 11 9 9 10 7 5 输出样例 19 2.数据输入:个人设定,由键盘输入。 3.要求: 1)上述题目任选一做。上机前,完成程序代码的编写 2)独立完成实验及实验报告 三、实验步骤 1.理解算法思想和问题要求; 2.编程实现题目要求; 3.上机输入和调试自己所编的程序; 4.验证分析实验结果; 5.整理出实验报告。

实验二 动态规划算法棋盘覆盖

实验二动态规划算法棋盘覆盖 最长公共子序列问题 一、实验目的 : 1、熟悉最长公共子序列问题的算法; 2、初步掌握动态规划算法。 二、实验内容 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 三、实验步骤 1、代码 // ZXL_1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostream.h" #include //#include "make2DArray.h" void make2DArray(int** &x , int rows , int cols ) { //创建行指针 x = new int*[rows] ;

//为每一行分配空间 for( int i= 0 ; i

动态规划算法的应用实验报告

实验二动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 1.问题描述: 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、算法设计 void main() { 申明一个5*5的二维数组; for(int i=0;i<5;i++) { for(int j=0;j<=i;j++) { 输入数组元素p[i][j]; }

} for(int k=0;k<5;k++) { for(int w=0;w<=k;w++) { 输出数组元素p[k][w]; } } for(int a=4;a>0;a--) { for(int s=0;s<=a;s++) { if(p[a][s]大于p[a][s+1]) p[a-1][s]等于p[a-1][s]加p[a][s]; else p[a-1][s] 等于p[a-1][s] 加p[a][s+1]; } } 输出p[0][0] }

四.程序调试及运行结果分析 五.实验总结 虽然这个实验比较简单,但是通过这次实验使我更加了解的动态规划法的好处和、,在解决问题时要尝试使用动态规划,这样就有可能得到一种即简单复杂性有不高的算法。

算法实验动态规划----矩阵连乘

实验三:动态规划法 【实验目的】 深入理解动态规划算法的算法思想,应用动态规划算法解决实际的算法问题。 【实验性质】 验证性实验。 【实验要求】 对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。该问题描述为:一般地,考虑矩阵A1,A2,…,An的连乘积,它们的维数分别为d0,d1,…,dn,即Ai的维数为di-1×di (1≤i≤n)。确定这n个矩阵的乘积结合次序,使所需的总乘法次数最少。对应于乘法次数最少的乘积结合次序为这n个矩阵的最优连乘积次序。按给定的一组测试数据对根据算法设计的程序进行调试:6个矩阵连乘积A=A1×A2×A3×A4×A5×A6,各矩阵的维数分别为:A1:10×20,A2:20×25,A3:25×15,A4:15×5,A5:5×10,A6:10×25。完成测试。 【算法思想及处理过程】

【程序代码】

printf ("\n\n矩阵连乘次数的最优值为:\n"); printf ("-----------------------------------------------\n"); print2 (0, 6-1, s); printf ("\n-----------------------------------------------\n\n"); return 0; } void MatrixChain (int p[], int m[][6], int s[][6], int n) { int i, j, k, z, t; for (i=0; i

南京邮电大学算法设计实验报告——动态规划法

实验报告 (2009/2010学年第一学期) 课程名称算法分析与设计A 实验名称动态规划法 实验时间2009 年11 月20 日指导单位计算机学院软件工程系 指导教师张怡婷 学生姓名丁力琪班级学号B07030907 学院(系) 计算机学院专业软件工程

实验报告 实验名称动态规划法指导教师张怡婷实验类型验证实验学时2×2实验时间2009-11-20一、实验目的和任务 目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态规划法解决实际应用中的最长公共子序列问题。 任务:用动态规划法实现求两序列的最长公共子序列,其比较结果可用于基因比较、文章比较等多个领域。 要求:掌握动态规划法的思想,及动态规划法在实际中的应用;分析最长公共子序列的问题特征,选择算法策略并设计具体算法,编程实现两输入序列的比较,并输出它们的最长公共子序列。 二、实验环境(实验设备) 硬件:计算机 软件:Visual C++

三、实验原理及内容(包括操作过程、结果分析等) 1、最长公共子序列(LCS)问题是:给定两个字符序列X={x1,x2,……,x m}和Y={y1,y2,……,y n},要求找出X和Y的一个最长公共子序列。 例如:X={a,b,c,b,d,a,b},Y={b,d,c,a,b,a}。它们的最长公共子序列LSC={b,c,d,a}。 通过“穷举法”列出所有X的所有子序列,检查其是否为Y的子序列并记录最长公共子序列并记录最长公共子序列的长度这种方法,求解时间为指数级别的,因此不可取。 2、分析LCS问题特征可知,如果Z={z1,z2,……,z k}为它们的最长公共子序列,则它们一定具有以下性质: (1)若x m=y n,则z k=x m=y n,且Z k-1是X m-1和Y n-1的最长公共子序列; (2)若x m≠y n且x m≠z k,则Z是X m-1和Y的最长公共子序列; (3)若x m≠y n且z k≠y n,则Z是X和Y的最长公共子序列。 这样就将求X和Y的最长公共子序列问题,分解为求解较小规模的问题: 若x m=y m,则进一步分解为求解两个(前缀)子字符序列X m-1和Y n-1的最长公共子序列问题; 如果x m≠y n,则原问题转化为求解两个子问题,即找出X m-1和Y的最长公共子序列与找出X 和Y n-1的最长公共子序列,取两者中较长者作为X和Y的最长公共子序列。 由此可见,两个序列的最长公共子序列包含了这两个序列的前缀的最长公共子序列,具有最优子结构性质。 3、令c[i][j]保存字符序列X i={x1,x2,……,x i}和Y j={y1,y2,……,y j}的最长公共子序列的长度,由上述分析可得如下递推式: 0 i=0或j=0 c[i][j]= c[i-1][j-1]+1 i,j>0且x i=y j max{c[i][j-1],c[i-1][j]} i,j>0且x i≠y j 由此可见,最长公共子序列的求解具有重叠子问题性质,如果采用递归算法实现,会得到一个指数时间算法,因此需要采用动态规划法自底向上求解,并保存子问题的解,这样可以避免重复计算子问题,在多项式时间内完成计算。 4、为了能由最优解值进一步得到最优解(即最长公共子序列),还需要一个二维数组s[][],数组中的元素s[i][j]记录c[i][j]的值是由三个子问题c[i-1][j-1]+1,c[i][j-1]和c[i-1][j]中的哪一个计算得到,从而可以得到最优解的当前解分量(即最长公共子序列中的当前字符),最终构造出最长公共子序列自身。

算法分析与设计实验二:动态规划法

题目:用动态规划法实现求两序列的最长公共子序列。 程序代码 #include #include //memset需要用到这个库 #include using namespace std; int const MaxLen = 50; class LCS { public: LCS(int nx, int ny, char *x, char *y) //对数据成员m、n、a、b、c、s初始化{ m = nx; //对m和n赋值 n = ny; a = new char[m + 2]; //考虑下标为0的元素和字符串结束标记 b = new char[n + 2]; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(int i = 0; i < nx + 2; i++) //将x和y中的字符写入一维数组a和b中a[i + 1] = x[i]; for(int i = 0; i < ny + 2; i++) b[i + 1] = y[i]; c = new int[MaxLen][MaxLen]; //MaxLen为某个常量值 s = new int[MaxLen][MaxLen]; memset(c, 0, sizeof(c)); //对二维数组c和s中元素进行初始化 memset(s, 0, sizeof(s)); } int LCSLength(); //求最优解值(最长公共子序列长度) void CLCS() //构造最优解(最长公共子序列) { CLCS(m, n); //调用私有成员函数CLCS(int,int) } private: void CLCS(int i, int j); int (*c)[MaxLen], (*s)[MaxLen]; int m, n;

算法设计与分析实验报告

本科实验报告 课程名称:算法设计与分析 实验项目:递归与分治算法 实验地点:计算机系实验楼110 专业班级:物联网1601 学号:2016002105 学生姓名:俞梦真 指导教师:郝晓丽 2018年05月04 日

实验一递归与分治算法 1.1 实验目的与要求 1.进一步熟悉C/C++语言的集成开发环境; 2.通过本实验加深对递归与分治策略的理解和运用。 1.2 实验课时 2学时 1.3 实验原理 分治(Divide-and-Conquer)的思想:一个规模为n的复杂问题的求解,可以划分成若干个规模小于n的子问题,再将子问题的解合并成原问题的解。 需要注意的是,分治法使用递归的思想。划分后的每一个子问题与原问题的性质相同,可用相同的求解方法。最后,当子问题规模足够小时,可以直接求解,然后逆求原问题的解。 1.4 实验题目 1.上机题目:格雷码构造问题 Gray码是一个长度为2n的序列。序列无相同元素,每个元素都是长度为n的串,相邻元素恰好只有一位不同。试设计一个算法对任意n构造相应的Gray码(分治、减治、变治皆可)。 对于给定的正整数n,格雷码为满足如下条件的一个编码序列。 (1)序列由2n个编码组成,每个编码都是长度为n的二进制位串。 (2)序列中无相同的编码。 (3)序列中位置相邻的两个编码恰有一位不同。 2.设计思想: 根据格雷码的性质,找到他的规律,可发现,1位是0 1。两位是00 01 11 10。三位是000 001 011

010 110 111 101 100。n位是前n-1位的2倍个。N-1个位前面加0,N-2为倒转再前面再加1。 3.代码设计:

运筹学实验_动态规划

实验二用MATLAB解决动态规划问题 问题:有一部货车每天沿着公路给四个售货店卸下6箱货物,如果各零售店出售该货物所得利润如下表所示,试求在各零售店卸下几箱货物,能使获得总利润最 解: 1)将问题按售货店分为四个阶段 2)设s k表示为分配给第k个售货店到第n个工厂的货物数, x k设为决策变量,表示为分配给第k个售货店的货物数, 状态转移方程为s k+1=s k-x k。 P k(x k)表示为x k箱货物分到第k个售货店所得的盈利值。 f k(s k)表示为s k箱货物分配给第k个售货店到第n个售货店的最大盈利值。 3)递推关系式: f k(s k)=max[ P k(x k)+ f k+1(s k-x k) ] k=4,3,2,1 边界条件:f5(s5)=0 4)从最后一个阶段开始向前逆推计算。 第四阶段: 设将s4箱货物(s4=0,1,2,3,4,5,6)全部分配给4售货店时,最大盈利值为: f4(s4)=max[P4(x4)] 其中x4=s4=0,1,2,3,4,5,6 x4*表示使得f4(s4)为最大值时的最优决策。 第三阶段:

设将s3箱货物(s3=0,1,2,3,4,5,6)分配给3售货店与4售货店时,对每一个s3值,都有一种最优分配方案,使得最大盈利值为:f3(s3)=max[ P3(x3)+ f4(s3-x3) ] ,x3= 第二阶段: 设将s2箱货物(s2=0,1,2,3,4,5,6)分配给2售货店、3售货店与4售货店时,则最大盈利值为:f2(s2)=max[ P2(x2)+ f3(s2-x2) ] 第一阶段: 设将s2箱货物(s1=0,1,2,3,4,5,6)分配给1售货店、2售货店、3售货店与4售货店时,则最大盈利值为:f1(s1)=max[ P1(x1)+ f2(s1-x1) ] 按计算表格的顺序反推,可知最优分配方案有6个: 1) x1*=1,x2*=1,x3*=3,x4*=1。 2) x1*=1,x2*=2,x3*=2,x4*=1。 3) x1*=1,x2*=3,x3*=1,x4*=1。

算法设计与分析---动态规划实验

《算法设计与分析》实验报告实验二递归与分治策略

Module 1: 免费馅饼 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 59327 Accepted Submission(s): 20813 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标: 为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问gameboy最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼) Input 输入数据有多组。每组数据的第一行为以正整数n(0

算法实验 动态规划上机

实验3动态规划上机 [实验目的] 1.掌握动态规划的基本思想和效率分析方法; 2.掌握使用动态规划算法的基本步骤; 3.学会利用动态规划解决实际问题。 [实验要求] 按以下实验内容完成题目,并把编译、运行过程中出现的问题以及解决方法填入实验报告中,按时上交。 [实验学时] 2学时。 [实验内容] 一、实验内容 利用动态规划算法编程求解多段图问题,要求读入多段图,考虑多段图的排序方式,求源点到汇点的最小成本路径。并请对自己的程序进行复杂性分析。 二、算法描述 先输入点的个数和路径数以及每段路径的起点、长度、终点,再计算所有路径的值大小,比较输出后最小值。 三、源程序 #define N 2147483647 #include #include void main() { int i,pointnum,j; cout<<"输入图中点的个数:"<>pointnum; int **array; //array数组描述多段图 int *array2; //array2记录距离起点的最小路径 int *array3; //array3记录上一点编号 array=new int*[pointnum]; array2=new int[pointnum+1]; array3=new int[pointnum+1]; for(i=0;i

} array2[pointnum]=N; array3[pointnum]=N; for(i=0;i>pathnum; int a,k; cout<<"依次输入图中每段路径"<>i; cin>>a; cin>>j; array[i][j]=a; if(array2[j]>(a+array2[i])) { array3[j]=i; array2[j]=a+array2[i]; } // cout<

实验报告:动态规划---0-1背包问题)

XXXX大学计算机学院实验报告计算机学院2017级软件工程专业 5 班指导教师 学号姓名2019年10 月21 日成绩

实验内容、上机调试程序、程序运行结果 System.out.println("选中的物品是第"); for(int i=1;i<=n;i++){ for(int j=1;j<=maxweight;j++){ //当前最大价值等于放前一件的最大价值 maxvalue[i][j] = maxvalue[i-1][j]; //如果当前物品的重量小于总重量,可以放进去或者拿出别的东西再放进去 if(weight[i-1] <= j){ //比较(不放这个物品的价值)和(这个物品的价值放进去加上当前能放的总重量减去当前物品重量时取i-1个物品是的对应重量时候的最高价值) if(maxvalue[i-1][j-weight[i-1]] + value[i - 1] > maxvalue[i-1][j]){ maxvalue[i][j] = maxvalue[i-1][j-weight[i-1]] + value[i - 1]; } } } } return maxvalue[n][maxweight]; } public static void main(String[] args) { int weight[] = {2,3,4,5}; int value[] = {3,4,5,7}; int maxweight = 8; System.out.println(knapsack(weight,value,maxweight)); } } 完成效果:

实验项目三 用蛮力法、动态规划法和贪心法求解背包问题

实验项目三 用蛮力法、动态规划法和贪心法求解0/1 背包问题 实验目的 1、学会背包的数据结构的设计,针对不同的问题涉及到的对象的数据结构的设计也不同; 2、对0-1背包问题的算法设计策略对比与分析。 实验内容: 0/1背包问题是给定n 个重量为{w 1, w 2, … ,wn }、价值为{v 1, v 2, … ,vn }的物品和一个容量为C 的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中。 在0/1背包问题中,物品i 或者被装入背包,或者不被装入背包,设xi 表示物品i 装入背包的情况,则当xi =0时,表示物品i 没有被装入背包,xi =1时,表示物品i 被装入背包。根据问题的要求,有如下约束条件和目标函数: 于是,问题归结为寻找一个满足约束条件式1,并使目标函数式2达到最大的解向量X =(x 1, x 2, …, xn )。 背包的数据结构的设计: typedef struct object { int n;//物品的编号 int w;//物品的重量 int v;//物品的价值 }wup; wup wp[N];//物品的数组,N 为物品的个数 int c;//背包的总重量 1、蛮力法 蛮力法是一种简单直接的解决问题的方法,常常直接基于问题的描述和所涉及的概念定义。蛮力法的关键是依次处理所有的元素。 用蛮力法解决0/1背包问题,需要考虑给定n 个物品集合的所有子集,找出所有可能的子集(总重量不超过背包容量的子集),计算每个子集的总价值,然后在他们中找到价值最大的子集。 所以蛮力法解0/1背包问题的关键是如何求n 个物品集合的所有子集,n 个物品的子集有2的n 次方个,用一个2的n 次方行n 列的数组保存生成的子集,以下是生成子集的算法: ?????≤≤∈≤∑=)1(}1,0{1n i x C x w i n i i i (式1) ∑=n i i i x v 1max (式2)

实验二 动态规划算法—李明明

实验二动态规划算法(2学时) 一、实验目的与要求 1、熟悉最长公共子序列问题的算法; 2、初步掌握动态规划算法; 二、实验题 若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X 和Y的公共子序列。 给定2个序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最长公共子序列。 三、实验提示 include "stdlib.h" #include "string.h" void LCSLength(char *x ,char *y,int m,int n, int **c, int **b) { int i ,j; for (i = 1; i <= m; i++) c[i][0] = 0; for (i = 1; i <= n; i++) c[0][i] = 0; for (i = 1; i <= m; i++) for (j = 1; j <= n; j++) { if (x[i]==y[j]) { c[i][j]=c[i-1][j-1]+1; b[i][j]=1; } else if (c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; b[i][j]=2; } else { c[i][j]=c[i][j-1]; b[i][j]=3; } } } void LCS(int i ,int j, char *x ,int **b) { if (i ==0 || j==0) return;

动态规划算法实验报告

动态规划算法实验报告

————————————————————————————————作者: ————————————————————————————————日期:

实验标题 1、矩阵连乘 2、最长公共子序列3、最大子段和 4、凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树 实验目的掌握动态规划法的基本思想和算法设计的基本步骤。 实验内容与源码1、矩阵连乘 #include #include using namespace std; const int size=4; //ra,ca和rb,cb分别表示矩阵A和B的行数和列数 void matriMultiply(int a[][4],int b[][4],int c[][4],int ra,intca,int rb,int cb) { if(ca!=rb) cerr<<"矩阵不可乘"; for(int i=0;i<ra;i++) for(int j=0;j<cb;j++) { int sum=a[i][0]*b[0][j]; for(int k=1;k

中南大学算法实验报告

算法设计与分析基础 ——实验报告 姓名:周建权 学号:0909122820 班级:信安1202

实验一分治 —最近点对 一.问题 Problem Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitched at some toys, with all the toys encircled awarded. In the field of Cyberground, the position of each toy is fixed, and the ring is carefully designed so it can only encircle one toy at a time. On the other hand, to make the game look more attractive, the ring is designed to have the largest radius. Given a configuration of the field, you are supposed to find the radius of such a ring. Assume that all the toys are points on a plane. A point is encircled by the ring if the distance between the point and the center of the ring is strictly less than the radius of the ring. If two toys are placed at the same point, the radius of the ring is considered to be 0. Input The input consists of several test cases. For each case, the first line contains an integer N (2 <= N <= 100,000), the total number of toys in the field. Then N lines follow, each contains a pair of (x, y) which are the coordinates of a toy. The input is terminated by N = 0. Output For each test case, print in one line the radius of the ring required by the Cyberground manager, accurate up to 2 decimal places. 二.分析思路 题目是给n个点的坐标,求距离最近的一对点之间距离的一半。第一行是一个数n表示有n个点,接下来n行是n个点的x坐标和y坐标。 首先,假设点是n个,编号为1到n。找一个中间的编号mid,先求出1到mid点的最近距离设为d1,还有mid+1到n的最近距离设为d2。如果说最近点对中的两点都在1-mid 集合中,或者mid+1到n集合中,则d就是最小距离了。但是还有可能的是最近点对中的两点分属这两个集合,若存在,则把这个最近点对的距离记录下来,去更新d。这样就得到最小的距离d了。 三.源代码 #include #include #include using namespace std; #define N 1000010 struct point {

动态规划 求解资源分配 实验报告

动态规划求解资源分配 实验目标: (1)掌握用动态规划方法求解实际问题的基本思路。 (2)进一步理解动态规划方法的实质,巩固设计动态规划算法的基本步骤。 实验任务: (1)设计动态规划算法求解资源分配问题,给出算法的非形式描述。 (2)在Windows环境下用C语言实现该算法。计算10个实例,每个实例中n=30,m=10,C i j为随机产生于范围(0,103)内的整数。记录各实例的数据及执行结果(即最优分配方案、最优分配方案的值)、运行时间。 (3)从理论上分析算法的时间和空间复杂度,并由此解释相应的实验结果。 实验设备及环境: PC;C/C++等编程语言。 实验主要步骤: (1)认真阅读实验目的与实验任务,明确本次实验的内容; (2)分析实验中要求求解的问题,根据动态规划的思想,得出优化方程; (3)从问题出发,设计出相应的动态规划算法,并根据设计编写程序实现算法; (4)设计实验数据并运行程序、记录运行的结果; (5)分析算法的时间和空间复杂度,并由此解释释相应的实验结果; 问题描述:资源分配问题 某厂根据计划安排,拟将n台相同的设备分配给m个车间,各车间获得这种设备后,可以为国家提供盈利C i j(i台设备提供给j号车间将得到的利润,1≤i≤n,1≤j≤m) 。问如何分配,才使国家得到最大的盈利? 1.问题分析: 本问题是一简单资源分配问题,由于具有明显的最优子结构,故可以使用动态规划求解,用状态量f[i][j]表示用i台设备分配给前j个车间的最大获利,那么显然有f[i][j] = max{ f[k][j–1] + c[i-k][j] },0<=k<=i。再用p[i][j]表示获得最优解时第j号车间使用的设备数为i-p[i][j],于是从结果倒推往回求即可得到分配方案。程序实现时使用顺推,先枚举车间数,再枚举设备数,再枚举状态转移时用到的设备数,简单3重for循环语句即可完成。时间复杂度为O(n^2*m),空间复杂度为O(n*m),倘若此题只需求最大获利而不必求方案,则状态量可以减少一维,空间复杂度优化为O(n)。

动态规划算法的应用

动态规划算法的应用 一、实验目的 1.掌握动态规划算法的基本思想,包括最优子结构性质和基于表格的最优值计算方法。 2.熟练掌握分阶段的和递推的最优子结构分析方法。 3.学会利用动态规划算法解决实际问题。 二、实验内容 题目一:数塔问题 给定一个数塔,其存储形式为如下所示的下三角矩阵。在此数塔中,从顶部出发,在每一节点可以选择向下走还是向右走,一直走到底层。请找出一条路径,使路径上的数值和最大。 输入样例(数塔): 9 15 10 6 8 2 18 9 5 19 7 10 4 16 输出样例(最大路径和): 59 三、实验步骤 (1)需求分析 通过动态规划法解决数塔问题。从顶部出发,在每一节点可以选择向下或者向右走,一直走到底层,以找出一条数值最大的路径。 (2)概要设计 本次实验程序主要用到二维数组,以及通过动态规划法进行比较每个数的大小。主要运用两个for循环语句实现动态规划。

(3)详细设计 第一步,输入给定的二维数组并打印出相应的数组: int array[5][5]={{9}, /* */{12,15}, /* */{10,6,8}, /* */{2,18,9,5}, /* */{19,7,10,4,6}}; int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) cout<0;j--) { for(i=0;i<=4;i++) { if(array[j][i]>array[j][i+1]) array[j-1][i]=array[j][i]+array[j-1][i]; else array[j-1][i]=array[j][i+1]+array[j-1][i]; } } 第三步,输出最大路径的值。 cout<

动态规划算法实验报告

实验标题 1、矩阵连乘 2、最长公共子序列 3、最大子段和 4、凸多边形最优三角剖分 5、流水作业调度 6、0-1背包问题 7、最优二叉搜索树 实验目的掌握动态规划法的基本思想和算法设计的基本步骤。 实验内容与源码1、矩阵连乘 #include #include using namespace std; const int size=4; //ra,ca和rb,cb分别表示矩阵A和B的行数和列数 void matriMultiply(int a[][4],int b[][4],int c[][4],int ra ,int ca,int rb ,int cb ) { if(ca!=rb) cerr<<"矩阵不可乘"; for(int i=0;i

运筹学实验_动态规划说课材料

运筹学实验_动态规划

实验二用MATLAB解决动态规划问题 问题:有一部货车每天沿着公路给四个售货店卸下6箱货物,如果各零售 店出售该货物所得利润如下表所示,试求在各零售店卸下几箱货物,能使获得 总利润最大?其值为多少? 解: 1) 将问题按售货店分为四个阶段 2) 设s k表示为分配给第k个售货店到第n个工厂的货物数, x k设为决策变量,表示为分配给第k个售货店的货物数, 状态转移方程为S k +1 = S k—X k。 P k(X k)表示为X k箱货物分到第k个售货店所得的盈利值。 f k(S k)表示为S k箱货物分配给第k个售货店到第n个售货店的最大盈利值。 3) 递推关系式: f k(S k)= max[ P k(X k)+ f k+1(s k—X k) ] k=4,3,2,1 边界条件:f5(S5) = 0

4)从最后一个阶段开始向前逆推计算。 第四阶段: 设将S4箱货物(S4 = 0,1,2,3,4,5,6 )全部分配给4售货店时,最大盈利 值为:f4(s4)= max[P4(x4)]其中x4= S4 = 0,1,2,3,4,5,6 乂4*表示使得f4 4 设将S3箱货物(S3 = 0,1,2,3,4,5,6 )分配给3售货店和4售货店时,对 每一个S3值,都有一种最优分配方案,使得最大盈利值为:f3(S3)= S3 —x3) ],x3 = 0,1,2,3,4,5,6 max[ P 3(x3)+ f4 设将S2箱货物(S2 = 0,1,2,3,4,5,6 )分配给2售货店、3售货店和4售货店时,则最大盈利值为:f2(S2)= max[ P 2(x2)+ f3(S2—X2)] 其中,X2= 0,123,4,5,6

相关文档
最新文档