您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页动态规划算法设计

动态规划算法设计

来源:筏尚旅游网
算法设计与分析实验报

专 业 姓 名 实验名称 实验目的 实验内容 班 级 学 号 实验二:动态规划算法设计 1.掌握动态规划解决问题的一般过程。 2.通过使用动态规划算法求解给定问题,学会使用动态规划解决实际问题。 1、天平平衡问题:已知一个天平左右两端共有n个挂钩,且有m个不同质量的钩码,求将钩码全部挂到钩子上使天平平衡的方法的总数。试设计求解该问题的动态规划算法。 2、数塔问题 :对于诸如下图的数塔,若从顶层走到底层,每一步只能走到相邻的结点,求经过的结点的数字之和最大的路径。试设计求解该问题的动态规划算法。 1. 天平平衡问题的解题思路或算法思想: m个钩码要么挂在左边,要么挂在右边,使得左右平衡,也就是说使得左右两边的钩码重量之和相等;很自然的就能知道,左边或者右边的钩码重量之和是全部钩码重量之后的二分之一。此时,问题就转换成:数组组合问题m个数字,数字即钩码的重量 2. 数塔问题的解题思路或算法思想: 自顶向下进行分析,自底向上执行计算 从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取到最大值,只有左右两道路径上的最大值求出来了才能作出决策。同样的道理下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层一层推下去,直到倒数第二层时就非常明了。 所以第一步对第五层的5个数据,做如下四次决策: 如果经过第四层2,则在第五层的19和7中肯定是19; 如果经过第四层18,则在第五层的7和10中肯定是10; 如果经过第四层9,则在第五层的10和4中肯定是10; 如果经过第四层5,则在第五层的4和16中肯定是16; 经过一次决策,问题降了一阶。5层数塔问题转换成4层数塔问题,如此循环决策…… 最后得到1阶的数塔问题。 算法描述 1. 天平平衡问题的程序: package com.t7; public class Tianping{ public static void main(String[] args) { int m = 27; //全部钩码的重量之和的二分之一,问题中的n int n = 9; //钩码的数量,即题目中的m(个钩码) int a[] = {10,9,8,7,6,5,4,3,2}; int h[] =new int[1001]; h[0]=1; for (int i = 1; i <=n; i++) { for (int j = m; j >=1; j--) { if(j>=a[i-1]){ h[j]=h[j]+h[j-a[i-1]]; } } } for (int j = 0; j <=m; j++) System.out.print(h[j]+\" \"); } } 程序及运行结果 实例: 2. 数塔问题的程序: package com.t4; import java.util.Scanner; public class Main { public static void main(String [] args){ System.out.print(\"输入数组的层数: \"); Scanner scan=new Scanner(System.in); int n=scan.nextInt();//定义数塔层数n; int d[][]=new int[n][n]; System.out.print(\"输入数组元素:\"); for(int i=0;i=j) d[i][j]=scan.nextInt(); } } int result = dataTower(d); } public static int dataTower(int tower[][]) { int heigh = tower.length;//数塔高度 int len = tower[heigh - 1].length;//数塔底部宽度 int [][] resultTower = new int[heigh][len];//结果数塔,存放路径数值和 int [][] path = new int[heigh][len]; //计算结果数塔生成路径 for(int i = 0; i < len; i++) { resultTower[heigh - 1][i] = tower[heigh - 1][i]; } for(int i = heigh - 2; i >= 0; i--) { for(int j = 0; j <= i; j++) { if(resultTower[i + 1][j] > resultTower[i + 1][j + 1]) { resultTower[i][j] = tower[i][j] + resultTower[i + 1][j]; path[i][j] = j; }else { resultTower[i][j] = tower[i][j] + resultTower[i + 1][j + 1]; path[i][j] = j + 1; } } } System.out.println(\"最大数值和为\" + resultTower[0][0] + \"\\n\"); System.out.print(\"路径为:\" + tower[0][0]); int j = path[0][0]; for(int i = 1; i <= heigh - 1; i++){ System.out.print(\"->\" + tower[i][j]); j = path[i][j]; } System.out.println(); return resultTower[0][0]; } } 实例: 1) 2) 总结 实验心得体会: 掌握动态规划解决问题的一般过程。并通过使用动态规划算法求解给定问题,学会使用动态规划解决实际问题。 改进意见: 应将动态规划问题与实际问题相结合,学会如何通过使用动态规划算法求解问题。

实验成绩: 指导教师: 年 月 日

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务