动态规划算法实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的 (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.整理出实验报告。

一.实验目的

二.问题描述

三.算法设计

包含:数据结构与核心算法的设计描述、函数调用及主函数设计、主要算法流程图等

动态规划主要针对最优化问题,它的决策不是线性的而是全面考虑各种不同的情况分别进行决策,最后通过多阶段决策逐步找出问题的最终解。

从数塔问题的特点来看,不难发现解决问题的阶段划分,应该是自上而下逐层决策。不同于贪婪策略的是做出的不是唯一的决策,要从全局出发。

0-1背包问题:用f记录不同承重量背包的总价值,w记录不同物品的重量,v记录不同物品的价值。在双重循环中,在放入第i个物品前后,检验不同j承重量背包的总价值,如果放入第i个物品后比放入前的价值提高了,则修改j承重量背包的价值,否则不变。

四.程序调试及运行结果分析

1.数塔问题:改正错误后,运行程序,构建一个三层数塔,依次输入塔中的数据后,运行结果为:路径和最大值为32 路径为9 15 8 经过验证,结果正确。

2.0-1背包问题:解决错误,运行程序。如图所示输入数据后,成功输出正确结果 19.

五.实验总结

对于这次的实验,我感觉到比较吃力。首先动态规划不同于贪婪算法,它是全面考虑各种不同的情况分别进行决策的。解决问题需要分阶段进行,更复杂一些。所以思考问题需要考虑的更加全面周到,在这一点上我做的还不够好。另外对于数塔问题,我首次使用三维数组,由于以前接触的少所以理解就使我感到比较困难。通过本次实验,我还是认识到自身有很多的不足,我也会在以后的学习中慢慢改进,脚踏实地,勤以补拙。

附录:程序清单(程序过长,可附主要部分)数塔问题代码如下:

#include

using namespace std;

int main()

{

int a[50][50][3],i,j,n;

cout<<"你要构建一个几层数塔?"<

cin>>n;

cout<<"请依次输入数塔中的数据:"<

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

{

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

{

cin>>a[i][j][1];

a[i][j][2]=a[i][j][1];

a[i][j][3]=0;

}}

for (i=n-1;i>=1;i--)

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

if (a[i+1][j][2]>a[i+1][j+1][2])

{

a[i][j][2]=a[i][j][2]+a[i+1][j][2];

a[i][j][3]=0;

}

else

{

a[i][j][2]=a[i][j][2]+a[i+1][j+1][2];

a[i][j][3]=1;

}

cout<<"路径和最大值为:"<

j=1;

cout<<"路径为:";

for( i=1 ;i<= n-1;i++)

{

cout<

j=j+a[i][j][3];

相关文档
最新文档