常用算法——动态规划算法

五大常用算法:分治、动态规划、贪心、回溯和分支界定 分治算法 一、基本概念    在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……     任何一个可以用计算机求解的 阅读详情

动态规划算法

算法介绍

  1. 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
  2. 动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
  3. 与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。(即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解)
  4. 动态规划可以通过填表的方式来逐步推进,得到最优解。

算法案例(背包问题)

有一个背包,容量容量为4,现有如下物品,要求达到背包容量最大值,并且不超过,物品不能重复。

物品重量价格
吉他(G)11500
音响(S)43000
电脑(L)32000

算法的主要思想,利用动态规划来解决。每次遍历到的第i个物品,根据w[i]和v[i]来确定是否需要将该物品放入背包中。即对于给定的n个物品,设v[i]、w[i]分别为第个物品的价值和重量,C为背包的容量。再令v[i][j]表示在前i个物品中能够装入容量j的背包中的最大价值。则我们有下面的结果:

  1. v[i][0]=v[0][j]=0;//表示填入的表的第一行和第一列是0
  2. 当w[i]>j时:v[i][j]=v[i-1][j] //当准备加入新增的商品的容量大于当前背包的容量时,就直接使用上一个单元格的装入策略
  3. 当j>=w[i]时:v[i][j]=max{v[i-1][i],v[i-1][j-w[i]]+v[i]} //v[i-1][j]:表示上一个单元格转入的最大值;v[i]:表示当前商品的价值

转化为填表

物品0磅1磅2磅3磅4磅
00000
吉他(G)01500G1500G1500G1500G
音响(S)01500G1500G1500G3000S
电脑(L)01500G1500G2000L2000L+1500G

代码实现

package com.dynamic;
public class KnapsackProblem {
	public static void main(String[] args) {
		int[] w = { 1, 4, 3 };// 物品的重量
		int[] val = { 1500, 3000, 2000 };// 物品价值
		int m = 4;// 背包的容量
		int n = val.length;// 物品个数
		// 创建二维数组
		// v[i][j]表示在前i个物品中能装入容量为j的背包中多的最大价值
		int[][] v = new int[n + 1][m + 1];
		// 记录加入商品的情况
		int[][] path = new int[n + 1][m + 1];
		// 初始化第一行和第一列
		for (int i = 0; i < v.length; i++) {
			v[i][0] = 0;// 设置第一列为0
		}
		for (int i = 0; i < v[0].length; i++) {
			v[0][i] = 0;// 将第一行设置为0
		}
		// 根据前面的公式进行动态规划
		for (int i = 1; i < v.length; i++) {
			for (int j = 1; j < v[0].length; j++) {
				if (w[i - 1] > j) {// 因为i是从1开始的,因此原来推到w[i]要修改w[i-1]
					v[i][j] = v[i - 1][j];
				} else {
					// 因为i从1开始,因此val[i-1] w[i-1]
					// v[i][j] = Math.max(v[i - 1][j], val[i - 1] + v[i - 1][j - w[i - 1]]);
					if (v[i - 1][j] < val[i - 1] + v[i - 1][j - w[i - 1]]) {
						v[i][j] = val[i - 1] + v[i - 1][j - w[i - 1]];
						path[i][j] = 1;
					} else {
						v[i][j] = v[i - 1][j];
					}

				}
			}
		}
		// 输出v
		for (int i = 0; i < v.length; i++) {
			for (int j = 0; j < v[i].length; j++) {
				System.out.print(v[i][j] + " ");
			}
			System.out.println();
		}
		// 输出最后我们放入的商品
		int i = path.length - 1;// 行最大下标
		int j = path[0].length - 1;// 列最大下标
		while (i > 0 && j > 0) {// 从path的最后开始找
			if (path[i][j] == 1) {
				System.out.printf("第%d个商品放入背包\n", i);
				j -= w[i - 1];
			}
			i--;
		}
	}
}
Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定 本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。 阅读详情

相关推荐

MATLAB对pcap文件抓包的读取

应用范围 常用的雷达信号,无线网通信信号的格式大多为pcap、wj文件,这里记录一下MATLAB读取pcap文件的方法,具体处理过程及读取协议针对不同的雷达有不同的处理方式,在这里不做说明。 程序 clc;clear;close all; %% 文件位置 filename= 'E:\File\JOB\JOB_1\data.pcap'; fid = fopen(filename,'r'); % 打开包 tmpPack = fread(fid,1350); % 只读前1350个数 读到

诗酒趁年华的博客 3578

动态规划常见实例详解

首先很多人问,何为动态规划?动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。通俗一点动态规划就是从下往上(从前向后)阶梯型求解数值。那么动态规划和递归有什么区别和联系?总的来说动态规划从前向后,递归从后向前,两者策略不同,并且一般动态规划效率高于递归。不过都要考虑初始状态,上下层数据之间的联系。很多时候用动态规划能解决的问题,用递归也能解决不过很多时候效率不高可能会用到记忆化搜索。不太明白?实现记忆化搜索求斐波那契代码为return1;......

qq_45228323的博客 5272

中国30米逐年植被净初级生产力(NPP)数据集(1982年至今CASA模型)

1.3 气温、降水、地表太阳辐射数据 气温和降水数据月度空间插值数据是基于全国2400多个站点的日观测数据,在计算各气象要素月值的基础上,基于Anusplin软件插值生成的1982年以来各月度30米分辨率气温和降水栅格数据,插值过程中引入高程作为协变量。气温单位为℃,降水单位为mm。1.2 土地覆盖数据 土地覆盖数据来源于1985 年-2020年全球30米精细地表覆盖动态监测产品,该数据集包含29个地表覆盖类型,进行拼接、裁剪、重分类和重采样处理,获得8期250米分辨率的植被类型数据。

地球资源数据云的官方博客 2839

程序员算法基础——动态规划

转自 https://mp.weixin.qq.com/s?__biz=MjM5OTM0MzIwMQ==&mid=2652560485&idx=2&sn=0f05e77d7852928e525ffe0defde045d&chksm=bcd2996b8ba5107ddd75d6d70f4d225e3fd1d34eedf00218b44fb3547caad4d...

weixin_30710457的博客 253

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

带你了解如何分析Jmeter监听器常用图表并定位瓶颈

1.1 Jmeter监听器常用图表 目录 1.1 Jmeter监听器常用图表 1.1-1 查看结果树 1.1-2 汇总报告 1.1-3 集合报告 1.1-4 综合图 1.1-5 断言结果 1.1-6 图形结果 1.1-7 响应时间图 1.2 Jmeter性能瓶颈定位 1.2-1 性能瓶颈产生的原因 1.2-2 性能瓶颈的解决方法 1.2-3 性能瓶颈如何定位 1.1-1 查看结果树 查看结果树:调试利器。可以查看每个请求具体的详情,方便进行测试的比对。有点类似我...

weixin_49029722的博客 4450

五大常用算法之动态规划算法

Authonr: Lijb Email: lijb1121@163.com 五大常用算法简介 1、递归与分治 递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。这就要求原始问题可以分解成相同问题的子问题。 示例:阶乘、斐波纳契数列、汉诺塔问题 斐波纳契数列:又称黄金分割数列,指的...

chenpanjc799055的博客 2008

【灰度共生矩阵(GLCM)原理及代码实现】

文章主旨详细介绍灰度共生矩阵(Gray-Level Co-occurrence Matrix, GLCM)的生成原理、核心特征量及其在图像纹理分析中的应用,并提供了可运行的Python代码实现。该网页是一篇理论结合实践的优秀技术文章。它不仅清晰地解释了GLCM这一经典纹理分析工具背后的数学原理,还提供了完整、可复现的代码,非常适合计算机视觉或图像处理领域的学习者和开发者入门并实践灰度共生矩阵。读者可以通过运行代码来直观理解GLCM如何工作,并提取图像的纹理特征。

blotemj.blog.youkuaiyun.com 179

动态规划——十大算法

动态规划 基本介绍 1、动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法 2、动态规划算法与分治算法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 3、与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。( 即下一个子阶段的求解是建立...

ALin_Think的博客 3764

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略

各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。

人工智能AI技术 909

基于STM32设计的环境监测系统(华为云IOT)_300

随着空气污染问题日益严峻,环境空气质量的监测变得愈加重要。为了解决这一问题,本项目设计并实现了一款基于STM32的空气质量监测设备,能够实时监测空气中的温湿度、二氧化碳浓度和甲醛浓度,并通过OLED显示屏展示数据。此外,设备支持通过WIFI模块将数据上传至云端,用户可以通过手机APP或Windows上位机查看实时数据。设备采用MQTT协议与华为云IOT物联网服务器进行数据通信,确保数据的实时性和可靠性。本项目还结合了低功耗设计和高灵敏度传感器,使得设备能够高效稳定地运行,并实现远程监控功能。

695

常用的十种算法--动态规划算法

分治算法

wcguang博客 2161

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

java 五大算法,五大常用算法之动态规划算法

Authonr: Lijb五大常用算法简介1、递归与分治递归算法:直接或者间接不断反复调用自身来达到解决问题的方法。这就要求原始问题可以分解成相同问题的子问题。示例:阶乘、斐波纳契数列、汉诺塔问题斐波纳契数列:又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F1=1,F2=1,Fn=F(n-1)+F(n-2)(n>...

weixin_39577908的博客 556

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

五大常用算法总结(穷举法, 贪婪算法,动态规划算法,分治算法,分支限界算法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/changyuanchn/article/details/51476281 </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/templ...

古月哲亭 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

常用算法大全-动态规划算法

常用算法大全-动态规划算法 作者:       类别: 程序员 function doZoom(size){var zoom=document.all?document.all[Zoom]:document.getElementById(Zoom);zoom.style.fontSize=size+px;}字体大小: 小

不再犹豫 3453

五大常用算法之二:动态规划算法

五大常用算法之二:动态规划算法 一、基本概念     动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想与策略

robertin的专栏 717

五大常用算法之一:动态规划算法

五大常用算法之一:动态规划算法 一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的...

李昊轩的博客 679

五大常用算法:分治、动态规划、贪心、回溯、分支限界

文章目录五大常用算法之一:分治算法五大常用算法之二:动态规划算法贪心算法例子五大常用算法之四:回溯法五大常用算法之五:分支限界法一、基本描述(1)分支搜索算法(2)分支限界搜索算法区别应用实例-分枝界限法(Branch and Bound Method)1、基本思想算法设计中的时空转换概念实现求解完全整数规划问题和混合整数规划问题的分支定界法。 五大常用算法之一:分治算法 实际上就是类似于数学归纳法,找到解决本问题的求解方程公式,然后根据方程公式设计递归程序。 1、一定是先找到最小问题规模时的求解方法 2、

AbiUni(YY熊) 2626

动态规划——五大常用算法之一

动态规划1、基本概念:动态规划就是:每走一步,都会根据之前的情况来决定这一步的走向,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。2、基本思想与策略:与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子...

likunkun__的博客 1660

常用的十种算法:二分查找,分治,动态规划,KMP

常用的十种算法 一、二分查找算法(非递归) 1.1 二分查找算法(非递归)介绍 前面我们讲过了二分查找算法,是使用递归的方式,下面我们讲解二分查找算法的非递归方式 二分查找法只适用于从有序的数列中进行查找(比如数字和字母等),将数列排序后再进行查找 二分查找法的运行时间为对数时间 O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n 步,假设从[0,99]的队列(100 个数,即 n=100)中寻到目标数 30,则需要查找步数为㏒₂100 , 即最多需要查找 7 次( 2^6 < 100 <

weixin_43967582的博客 2514

常用十大算法_动态规划算法(DP)

动态规划算法(DP) 高能预警:DP算法不容易理解,需要动脑筋+查资料+找例题 动态规划算法(Dynamic Programming),是将复杂问题拆分成子问题,并在子问题的基础上,求解复杂问题,子问题之间不是独立的,而是相互依存的。 动态规划算法有两种实现形式:递归,非递归 有点莫名其妙对吧,下面以例子来了解(递归的容易,非递归的难,要有心理准备:<) 【例一】01背包问题:有个容量为4的背包,有以下3种物品,物品具有价值和重量属性,要求装入的物品价值总和最大且装入物品不能重复 .

泥煤少年的博客 1万+

五大常用算法——动态规划

基本概念:   动态规划过程:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。 基本思想:   类似于分治算法(后续博客介绍),将一个待求解的问题分解成若干个子问题,顺序求解每个子问题,前一个子问题的解包含后一个子问题有用的信息。求解每一个子问题的最优解,则最后一个子问题的解就是初始问题的解。   动态规划问题求解过程中会出现子问题重叠的问题(就是重复计算子问题),我们可以利用一个二维数组将每一个子问题的解记录下

Andy_96的博客 745

五大常用算法之动态规划

五大常用算法之动态规划 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者...

King逍灬遥 1098
上一篇: 常见算法——分治算法
下一篇: 迪杰斯特拉算法——最短路径算法
lu_long
博客等级 码龄8年 11粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值