【学习笔记】Matlab和python双语言的学习(动态规划)
文章目录
- 前言
- 一、动态规划
- 动态规划的基本步骤
- 示例1
- 示例2
- 三、代码实现----Matlab
- 1.示例1
- 2.示例2
- 四、代码实现----python
- 1.示例1
- 2.示例2
- 总结
前言
通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF/?p=32&vd_source=67471d3a1b4f517b7a7964093e62f7e6
一、动态规划
- 动态规划(Dynamic Programming,简称 DP)是一种在计算机科学和数学中用于解决复杂问题的优化技术。它通过将问题分解为更小的子问题,存储这些子问题的解以避免重复计算,从而提高算法的效率。动态规划通常用于具有重叠子问题和最优子结构性质的问题。
动态规划的基本步骤
- 定义状态: 确定一个数组(或其他数据结构)来存储子问题的解。这个数组的每个元素代表一个子问题的解。
- 状态转移方程: 找到子问题之间的关系,定义一个递归关系(状态转移方程)来表示大问题和小问题之间的关系。
- 初始化: 确定初始条件,即基础子问题的解。
- 计算顺序: 通常是自底向上(从子问题到原问题)计算所有子问题的解。
示例1
硬币问题
- 你有三种硬币,分别面值2元、5元和7元的硬币组合起来正好付清,不需要对方找钱,每种硬币都有足够多,买一本书需要27元,如何用最少?
-
定义状态:
虽然不知道最优策略是什么,但是最优策略肯定是有 k k k 枚硬币, a 1 , a 2 , … a n a_1,a_2,… a_n a1,a2,…an 加起来面值为27,所以一定存在有最后一枚硬币: a k a_k ak 。除了这枚硬币,前面硬币的面值加起来是 27 − a k 27- a_k 27−ak
子问题:- 最少用多少枚硬币可以拼出 27 − a k 27- a_k 27−ak
- 原问题是最少用多少枚硬币可以拼出 27
- 我们将原问题可以转化成一个规模更小的子问题: 27 − a k 27- a_k 27−ak
- 状态:我们可以设状态 f ( x )=最少用多少枚硬币拼出 x
-
状态转移方程:
-
初始化:
初始条件: f [ 0 ] = 0 f[0]=0 f[0]=0
-
计算顺序:
计算 f [ 0 ] , f [ 1 ] , f [ 2 ] , . . . f [ x ] f[0],f[1],f[2],...f[x] f[0],f[1],f[2],...f[x]
当计算到 f [ x ] f[x] f[x] 时, f [ x − 2 ] , f [ x − 5 ] , f [ x − 7 ] f[x-2],f[x-5],f[x-7] f[x−2],f[x−5],f[x−7] 都已经算过了。
示例2
背包问题
- 给定 n n n 个物品,每个物品有一个重量 w i w_i wi 和一个价值 v i v_i vi。给定一个背包的最大承重 W W W,求解如何选择物品放入背包,使得在不超过最大承重的前提下,背包中的物品总价值最大。
-
定义状态:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示前 i i i 件物品放入容量为 j j j 的背包中所获得的最大价值
-
状态转移方程:
对于第 i i i 件物品,可以选择放或不放
如果不放,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i−1][j]
如果放,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j − w i ] + v i dp[i][j]=dp[i-1][j-w_i]+v_i dp[i][j]=dp[i−1][j−wi]+vi选择获得最大价值的情况,即 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w_i]+v_i) dp[i][j]=max(dp[i−1][j],dp[i−1][j−wi]+vi)
-
初始化:
初始条件:
d p [ 0 ] [ 0 ] = 0 dp[0][0]=0 dp[0][0]=0,将前 0 个物品放入容量为 0 的背包中能获得的最大价值为 0
如果容量为 0,则无法放入任何物品, d p [ i ] [ 0 ] = 0 dp[i][0]=0 dp[i][0]=0
如果没有物品可选,则无法放入任何物品, d p [ 0 ] [ j ] = 0 dp[0][j]=0 dp[0][j]=0。
-
计算顺序:
从第一个物品开始,求解到 n n n 最终, d p [ n ] [ W ] dp[n][W] dp[n][W] 即为问题的解
三、代码实现----Matlab
1.示例1
clear;clc
n = input('请输入要拼的金额:') + 1;
res = coinChange(n);
disp(['需要' int2str(res) '枚硬币'])
function res = coinChange(n)dp = ones(n,1) * +inf;dp(1) = 0; % 要拼出0块钱,需要0枚硬币for i = 2:nif (i >= 3)dp(i) = min(dp(i),dp(i-2) + 1); endif (i >= 6)dp(i) = min(dp(i),dp(i-5) + 1); endif (i >= 8)dp(i) = min(dp(i),dp(i-7) + 1);endendif dp(n) ~= +infres = dp(n);elseres = -1;end
end
运行结果:
2.示例2
clear;clc
c = input('请输入背包的容量:');
weight = input('请输入每件物品的重量:');
value = input('请输入每件物品的价值:');
res = bag_value(c,weight,value);
disp(['最大价值为:' int2str(res)])
function res = bag_value(c,w,v) % c是背包容量,w是每件物品的重量,v是每件物品的价值n = length(w); % n代表有多少件物品dp = zeros(n+1,c+1);for i = 2:n+1 % 第i-1个物品for j = 2:c+1 % j-1是容量if j-1 < w(i-1) % 背包容量小于当前物品重量,不能选择当前物品dp(i,j) = dp(i-1,j);else % 能选择当前物品,要选择价值更大的方案dp(i,j) = max(dp(i-1,j),dp(i-1,j-w(i-1))+v(i-1));endendendres = dp(n+1,c+1);
end
运行结果:
四、代码实现----python
1.示例1
# 硬币问题
def coinChange(n):dp = [float('inf')] * (n + 1)dp[0] = 0 # 要拼出0块钱,需要0枚硬币for i in range (1,n + 1):if (i >= 2):dp[i] = min(dp[i],dp[i-2]+1)if (i >= 5):dp[i] = min(dp[i],dp[i-5]+1)if (i >= 7):dp[i] = min(dp[i],dp[i-7]+1)if dp[n] != float('inf'):return dp[n]else:return -1n = int(input("请输入要拼的金额:"))
print("要拼的金额", n,"元")
print("需要", coinChange(n),"枚硬币")
运行结果:
2.示例2
# 背包问题
def bag_value(c,w,v):n = len(w)dp = [[0 for j in range(c + 1)] for i in range(n+1)] # 初始化动态规划数组for i in range(1,n + 1):for j in range(1,c+1): if j < w[i-1]: # 背包容量小于当前物品重量,不能选择当前物品dp[i][j] = dp[i-1][j]else: # 能选择当前物品,要选择价值更大的方案dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1])return dp[n][c]
c = int(input("请输入背包的容量:"))
weight = input("请输入每件物品的重量,用逗号隔开:")
value = input("请输入每件物品的价值,用逗号隔开:")
w = [int(x) for x in weight.split(',')]
v = [int(x) for x in value.split(',')]
print("背包的容量:",c)
print("每件物品的重量:",w)
print("每件物品的价值:",v)
print("最大价值为:",bag_value(c,w,v))
运行结果:
总结
本文介绍了动态规划,并通过典型示例建立模型,分别使用Matlab和python进行代码编写。
相关文章:

【学习笔记】Matlab和python双语言的学习(动态规划)
文章目录 前言一、动态规划动态规划的基本步骤示例1示例2 三、代码实现----Matlab1.示例12.示例2 四、代码实现----python1.示例12.示例2 总结 前言 通过模型算法,熟练对Matlab和python的应用。 学习视频链接: https://www.bilibili.com/video/BV1EK411…...
低代码开发:机遇与挑战的双重探索
随着科技的迅速发展,“低代码”开发平台悄然兴起,为非专业程序员提供了构建应用程序的快捷途径。无疑,这一创新技术正在颠覆传统的软件开发模式,并激发了IT行业的热烈讨论。但究竟低代码平台是提高开发效率的有利工具,…...

Docker最佳实践(三):安装mysql
大家好,欢迎各位工友。 本篇呢我们就来演示一下如何在Docker中部署MySQL容器,可以按照以下步骤进行: 1. 搜索镜像 首先搜索MySQL镜像,可以使用以下命令: docker search mysql2. 拉取镜像 根据需求选择MySQL或Maria…...

进阶SpringBoot之 Web 静态资源导入
idea 创建一个 web 项目 新建 controller 包下 Java 类,用来查验地址是否能成功运行 package com.demo.web.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;RestControl…...

【数据结构七夕专属版】单链表及单链表的实现【附源码和源码讲解】
本篇是博主在学习数据结构时的心得,希望能够帮助到大家,也许有些许遗漏,但博主已经尽了最大努力打破信息差,如果有遗漏还请见谅,嘻嘻,前路漫漫,我们一起前进!!࿰…...

鸿蒙笔记--Socket
这一节主要了解鸿蒙Socket通信,在鸿蒙系统中,Socket TCP通讯是一种常用的网络通信方式,它提供了可靠的、面向连接的数据传输服务。它主要用到ohos.net.socket这个库; constructTCPSocketInstance:创建一个 TCPSocket;…...

安装python+python的基础语法
安装python python2为内置,安装python3----3.6.8 最新安装3.12使用源码安装 1.查看yum源,epel [rootpython01 ~]# yum list installed |grep epel 2.安装python3 [rootpython01 ~]# yum -y install python3 3.查看版本 [rootpython01 ~]# python…...

html+css网页制作 国家体育总局2个页面模版(无js)
htmlcss网页制作 国家体育总局2个页面模版(无js) 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&a…...

Effective Java学习笔记第27、28条原生态类型和非受检警告
目录 什么是泛型 泛型与编译器 不要轻易使用原生态类型 可以通过通配符类型来替代原生态类型 几个适合原生态类型的场景 消除非受检的警告 什么是非受检警告 如果无法消除警告 本书27-33条主要介绍泛型。首先介绍什么是泛型,它的应用场景是什么。然后重点介…...
javaEE和javaSE
引用自:https://developer.baidu.com/article/detail.html?id3312755 文章目录 前景描述javaSE简介使用场景 javaEE(J2EE)简介使用场景 结语 前景描述 javaEE和javaSE是java中比较常见的两个概念,但是又比较容易忘记,在此进行记…...

Leetcode 17.电话号码的字母组合
目录 题目 方法一 思路 代码 题目 17. 电话号码的字母组合 难度:中等 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对…...

位1的个数
编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数(也被称为汉明重量)。 示例 1: 输入:n 11 输出:3 解释:输入的二进制串 1011 中,共有 3 个设置位。示…...

RPA在政务服务中的挑战与解决方案
随着数字化时代的到来,数字政务的建设已成必然趋势,RPA作为数字化转型的重要工具之一,能够帮助政府单位快速实现业务流程的自动化和智能化,提高工作效率和质量,为建设数字政务提供强有力的支持,因此正被越来…...

RabbitMQ docker安装
后台配置文件 rabbitmq:image: rabbitmq:latestcontainer_name: rabbitmqports:- "5672:5672" # RabbitMQ server port- "15672:15672" # RabbitMQ management console portenvironment:RABBITMQ_DEFAULT_USER: adminRABBITMQ_DEFAULT_PASS: admin 若要打…...

关于vs调试的一些基本技巧方法,建议新手学习
文章目录 1.Debug 和 Release2.VS的调试快捷键3.对程序的监视和内存观察3.1监视3.2内存 4.编程常见错误归类4.1编译型错误4.2链接型错误4.3运行时错误 1.Debug 和 Release 在我们使用的编译器 vs 中,这个位置有两个选项,分别为Debug和Release,…...
MySQL——索引(二)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引
若想在一个已经存在的表上创建索引,可以使用 CREATE INDEX 语句,CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中,UNIQUE、FULLTEXT 和…...
前端HTML总结
目录 前言 正文 head SEO body 网页的主要组成元素: body标签中常见的标签: 自闭合标签: 无语义标签: 特殊符号: 列表 子项: 样式修改: 定义列表: 语义化࿱…...
【动态规划】647. 回文子串
力扣链接:. - 力扣(LeetCode) 动规大法开始吟唱: dp[i][j]含义:从i到j的子串是否为回文子串 递推公式:当s[i] s[j]时 1. j-i<1时, dp[i][j]为true 2. 否则,若dp[i1][j-1]为true&#x…...

python-约瑟夫环(赛氪OJ)
[题目描述] n 个人( 0,1,2,3,4...n−1 ),围成一圈,从编号为 k 的人开始报数,报数报到 m 的人出队。 下次从出队的人之后开始重新报数,循环往复,当队伍中只剩最后一个人的时候,那个人…...
Less 教程:从入门到精通
Less 教程:从入门到精通 1. 引言 Less 是一种流行的动态样式表语言,它扩展了 CSS 的功能,使其更加强大和灵活。通过本教程,我们将深入探讨 Less 的基本概念、特性以及如何在项目中实际应用它。 2. Less 的基本概念 2.1 变量 …...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...