一、名称

动态规划法应用

二、目的

1.掌握动态规划法的基本思想;
2.学会运用动态规划法解决实际设计应用中碰到的问题。

三、要求

1.基于动态规划法思想解决背包问题(递归或自底向上的实现均可);
2.实现基于动态规划法思想的Warshall算法和Floyd算法。

四、仿真内容

1.基于动态规划法思想解决背包问题

1.1、解决背包问题的伪代码描述

算法 MFKnapsack(i,j)
//对背包问题实现记忆功能方法
//输入:一个非负整数i表示先考虑的物品数量,一个非负整数j表示背包的承受重量
//输出:前i个物品的最最优可行子集的价值
If F[I,j]<0
If j<MFKnapsack(i-1,j)
Value←MFKnapsack(i-1,j)
Else
value←max(MFKnapsack(i-1,j),
Values[i]+MFKnapsack(i-1,j-Weights[i]))
F[I,j] ←value
Return F[I,j]

2.2、解决背包问题的源代码实现

package com.zyz.back;

import java.util.Random;

public class BackQuestion {

    public static int knaspace(int[] weight, int[] value, int maxweight) {
// 参数 i为放入前i个物体,j为背包的最大承重量。
int n = weight.length;// 放入商品的质量
int[][] maxvalue = new int[n + 1][maxweight + 1];// 背包最大的价值。放入第i个在当前背包的最大价值 int[][] help = new int[n][2];//用来记录商品的价值和质量 for (int i = 0; i < maxweight + 1; i++) { // 第0个商品放入背包,最大价值为0
maxvalue[0][i] = 0;
} for (int i = 0; i < n + 1; i++) {
maxvalue[i][0] = 0;// 第i个商品放入背包为0的书包,最大价值为0
} // //参数 i为放入前i个物体,j为背包的最大承重量。 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个商品的价值maxvalue[i-1][j-weight[i-1]+value[i-1] if (maxvalue[i - 1][j - weight[i - 1]] + value[i - 1] > maxvalue[i][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 maxweight = 14;// 书包的容量
// 随机生成数组
int W = 15;
int V = 25;
Random random = new Random();
int[] weight = new int[20];
int[] value = new int[20]; // 随机给商品附加质量
for (int i = 0; i < weight.length; i++) { weight[i] = random.nextInt(W);
if(weight[i]==0){
weight[i]=2;
} } System.out.println("商品的质量:");
for (int i = 0; i < weight.length; i++) {
System.out.print(weight[i] + " ");
} System.out.println();
// 随机给商品附加值
System.out.println("商品的价值:");
for (int i = 0; i < value.length; i++) {
value[i] = random.nextInt(V);
if(value[i]==0){
value[i]=3;
}
} for (int i = 0; i < value.length; i++) {
System.out.print(value[i] + " ");
}
long startTime=System.currentTimeMillis();
int result = knaspace(weight, value, maxweight);
long endTime=System.currentTimeMillis();
long time=endTime-startTime;
System.out.println("\n背包最大的价值:" + result);
System.out.println("数据大小:"+value.length+" 耗时:"+time+"毫秒"); } }

2.3、时间效率分析

动态法实现背包问题,动态的增加背包的容量,保证放入的商品价值始终是最大的。判断每次新放入的商品和之前放入的商品价值之间的价值比较。比之前的价值大则放入背包。小则不放入。时间效率为Tn=(n).

2.实现基于动态规划法思想的warshall

2.1、warshall算法的伪代码描述

算法 Warshall(A[1…n,1…n])
//实现计算传递闭包的Warshall算法
//输入:包括n个顶点有向图的邻接矩阵A
//输出:该有向图的传递闭包
R(0)←A
For k←1 to n do
For i←1 to n do
For j←1 to n do
R(k)[I,j] ←R(I,j) or R(k-1)[I,k] and R(k-1)[k,j]
Return R(n)

2.2、warshall算法的源代码实现

package com.zyz.comlate;

import java.util.Scanner;

public class Warshall {

    public void warshall(int a[][]) {
for (int k = 0; k < a.length; k++) {//求取最终的封闭包通过R0求R1,通过R1求R2。。。。直到最后
for (int j = 0; j < a.length; j++) {//用来判断a[j][i]是否连通
if (a[k][j] == 1) {
for (int i = 0; i < a.length; i++) {
if (a[i][k] == 1) {
a[j][i] = 1;
}
}
}
}
} } //打印
public void print(int[][] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
} public static void main(String[] args) {
System.out.println("请输入阶数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] a = new int[n][n];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (i == j) {
a[i][j] = 0;
} else {
a[i][j] = (Math.random() > 0.6 ? 1 : 0);
} }
} Warshall warshall = new Warshall();
System.out.println("原始数据:");
warshall.print(a);
System.out.println("处理后的数据:"); long startTime=System.currentTimeMillis();
warshall.warshall(a);
long endTime=System.currentTimeMillis();
long time=endTime-startTime;
warshall.print(a);
System.out.println("耗时:"+time+"毫秒"); } }

2.3、时间效率分析

T=O(nnn)

3.实现基于动态规划法思想的Floyd算法

3.1、Floyd算法的伪代码描述

算法:Floyd(W[1..n],[1..n]
//实现计算完全最短路径的Floyd算法
//输入:不包含长度为负的回路的图的权重矩阵W
//输出:包含最短路径长度的距离矩阵
D←W
For k←1 to n do
For i←1 to n do
For j←1 to n do
D[I,j] ←min{D[I,j],D[I,j]+D[k,j]}
Return D

3.2、Floyd算法的源代码实现

package com.zyz.comlate;

import java.util.Scanner;

public class Floyd {

    public void floyd(int a[][]) {

        for (int k = 0; k < a.length; k++) {//求第Rk次的封闭包
for (int j = 0; j < a.length; j++) {//判断第Rk次的位置的最短路径。每次增加一个新的顶点。
for (int i = 0; i < a.length; i++) {
if (a[j][i] > (a[j][k] + a[k][i])) {//新的路径比原先的路径更加短,则将最短路径写入
a[j][i] = a[j][k] + a[k][i];
}
}
}
}
} // 打印
public void print(int[][] a) {
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (a[i][j] == 3 || a[i][j] == 7 || a[i][j] == 6 || a[i][j] == 5 || a[i][j] == 9) {
System.out.print("∞" + " ");
} else {
System.out.print(a[i][j] + " ");
}
}
System.out.println();
}
} public static void main(String[] args) {
System.out.println("请输入矩阵阶数:");
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] a = new int[n][n];
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
if (i == j) {
a[i][j] = 0;
} else {
a[i][j] = (int) (Math.random() * 10);
} }
}
Floyd floyd = new Floyd();
System.out.println("原始数据:");
floyd.print(a);
System.out.println("处理后的数据:");
long startTime = System.currentTimeMillis();
floyd.floyd(a);
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
floyd.print(a);
System.out.println("耗时:" + time + "毫秒"); } }

3.3、Floyd算法的时间效率分析

T=O(nnn)

4、运行结果

4.1、基于动态规划法思想解决背包问题

1)背包问题测试结果

4.2、Warshall算法的测试用例结果截图

4.3、Floyd算法的测试用例结果截图


5、小结

通过本次实验我了解到动态化和基于动态规划法思想的Warshall算法和Floyd算法使用。我对动态规划法有了更加深入的了解,通过把一个大的问题分级减少为若干个子问题,通过对子问题的求解最终达到求解问题的结果。

算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法的更多相关文章

  1. Warshall算法和Floyd算法

    不用说这两位都是冷门算法……毕竟O(n^3)的时间复杂度算法在算法竞赛里基本算是被淘汰了……而且也没有在这个算法上继续衍生出其他的算法… 有兴趣的话:click here.. 话说学离散的时候曾经有个 ...

  2. 【转】最短路径——Dijkstra算法和Floyd算法

    [转]最短路径--Dijkstra算法和Floyd算法 标签(空格分隔): 算法 本文是转载,原文在:最短路径-Dijkstra算法和Floyd算法 注意:以下代码 只是描述思路,没有测试过!! Di ...

  3. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  4. 最短路径Dijkstra算法和Floyd算法整理、

    转载自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最短路径—Dijkstra算法和Floyd算法 Dijks ...

  5. 【转载】Dijkstra算法和Floyd算法的正确性证明

      说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正   ----------- ...

  6. Dijkstra算法和Floyd算法的正确性证明

    说明: 本文仅提供关于两个算法的正确性的证明,不涉及对算法的过程描述和实现细节 本人算法菜鸟一枚,提供的证明仅是自己的思路,不保证正确,仅供参考,若有错误,欢迎拍砖指正   ------------- ...

  7. 最短路径—Dijkstra算法和Floyd算法

    原文链接:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html 最后边附有我根据文中Dijkstra算法的描述使用jav ...

  8. 最短路径—大话Dijkstra算法和Floyd算法

    Dijkstra算法 算法描述 1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , ...

  9. 最短路径—Dijkstra算法和Floyd算法【转】

    本文来自博客园的文章:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算法 1.定义概览 Dijk ...

随机推荐

  1. 万答#18,MySQL8.0 如何快速回收膨胀的UNDO表空间

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 背 ...

  2. Sphere类定义

    这个类是球体,也就是一会要显示的球体了.这个类继承于Geometrics类,并实现了自己的碰撞检测,碰撞原理,书上也说的很清楚了啊,大家多看.然后对照代码就明白了. 类定义: #pragma once ...

  3. 使用 CSS 构建强大且酷炫的粒子动画

    粒子动画,顾名思义,就是页面上存在大量的粒子构建而成的动画.传统的粒子动画主要由 Canvas.WebGL 实现. 当然,不使用 HTML + CSS 的主要原因在于,粒子动画通常需要较多的粒子,而如 ...

  4. 构建数据湖上低延迟数据 Pipeline 的实践

    T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...

  5. 从零开始Blazor Server(11)--编辑用户

    用户编辑和角色编辑几乎一模一样,这里先直接贴代码. @page "/user" @using BlazorLearn.Entity @using Furion.DataEncryp ...

  6. LuoguP2523 [HAOI2011]Problem c(概率DP)

    傻逼概率\(DP\),熊大坐这,熊二坐这,两熊体积从右往左挤,挤到\(FFF\)没座位了就不合理了 否则就向左歇斯底里爬,每个\(FFF\)编号就组合一下,完闭 #include <iostre ...

  7. BZOJ1305/Luogu3153 [CQOI2009]dance跳舞 (network flow)

    #define T 1001 #define S 0 struct Edge{ int nxt,pre,w; }e[500007]; int cntEdge,head[N]; inline void ...

  8. 如何开发一款基于 vite+vue3 的在线表格系统(下)

    在上篇内容中我们为大家分享了详细介绍Vue3和Vite的相关内容.在本篇中我们将从项目实战出发带大家了解Vite+Vue3 的在线表格系统的构建. 使用Vite初始化Vue3项目 在这里需要注意:根据 ...

  9. spring boot 中英文官方文档

    中文文档:http://oopsguy.com/documents/springboot-docs/1.5.4/index.html#boot-features 英文官方文档:https://docs ...

  10. JavaScript基础回顾知识点记录3

    js 中 垃圾回收 //将不在使用的对象设置为null , js就会自动进行垃圾回收机制 var obj = {}; obj = null; js 中 数组基本介绍 数组也是一个对象 与普通对象功能类 ...