当前位置: 首页 > news >正文

【学习笔记】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. 状态转移方程: 找到子问题之间的关系,定义一个递归关系(状态转移方程)来表示大问题和小问题之间的关系。
  3. 初始化: 确定初始条件,即基础子问题的解。
  4. 计算顺序: 通常是自底向上(从子问题到原问题)计算所有子问题的解。

示例1

硬币问题

  • 你有三种硬币,分别面值2元、5元和7元的硬币组合起来正好付清,不需要对方找钱,每种硬币都有足够多,买一本书需要27元,如何用最少?
  1. 定义状态:

    虽然不知道最优策略是什么,但是最优策略肯定是有 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 27ak
    在这里插入图片描述
    子问题:

    • 最少用多少枚硬币可以拼出 27 − a k 27- a_k 27ak
    • 原问题是最少用多少枚硬币可以拼出 27
    • 我们将原问题可以转化成一个规模更小的子问题: 27 − a k 27- a_k 27ak
    • 状态:我们可以设状态 f ( x )=最少用多少枚硬币拼出 x
  2. 状态转移方程:
    在这里插入图片描述

  3. 初始化:

    初始条件: f [ 0 ] = 0 f[0]=0 f[0]=0

  4. 计算顺序:

    计算 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[x2],f[x5],f[x7] 都已经算过了。

示例2

背包问题

  • 给定 n n n 个物品,每个物品有一个重量 w i w_i wi 和一个价值 v i v_i vi。给定一个背包的最大承重 W W W,求解如何选择物品放入背包,使得在不超过最大承重的前提下,背包中的物品总价值最大。
  1. 定义状态:

    d p [ i ] [ j ] dp[i][j] dp[i][j]表示前 i i i 件物品放入容量为 j j j 的背包中所获得的最大价值

  2. 状态转移方程:

    对于第 i i i 件物品,可以选择放或不放

    如果不放,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][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[i1][jwi]+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[i1][j],dp[i1][jwi]+vi)

  3. 初始化:

    初始条件:

    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

  4. 计算顺序:

    从第一个物品开始,求解到 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 总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频链接&#xff1a; https://www.bilibili.com/video/BV1EK411…...

低代码开发:机遇与挑战的双重探索

随着科技的迅速发展&#xff0c;“低代码”开发平台悄然兴起&#xff0c;为非专业程序员提供了构建应用程序的快捷途径。无疑&#xff0c;这一创新技术正在颠覆传统的软件开发模式&#xff0c;并激发了IT行业的热烈讨论。但究竟低代码平台是提高开发效率的有利工具&#xff0c;…...

Docker最佳实践(三):安装mysql

大家好&#xff0c;欢迎各位工友。 本篇呢我们就来演示一下如何在Docker中部署MySQL容器&#xff0c;可以按照以下步骤进行&#xff1a; 1. 搜索镜像 首先搜索MySQL镜像&#xff0c;可以使用以下命令&#xff1a; docker search mysql2. 拉取镜像 根据需求选择MySQL或Maria…...

进阶SpringBoot之 Web 静态资源导入

idea 创建一个 web 项目 新建 controller 包下 Java 类&#xff0c;用来查验地址是否能成功运行 package com.demo.web.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;RestControl…...

【数据结构七夕专属版】单链表及单链表的实现【附源码和源码讲解】

本篇是博主在学习数据结构时的心得&#xff0c;希望能够帮助到大家&#xff0c;也许有些许遗漏&#xff0c;但博主已经尽了最大努力打破信息差&#xff0c;如果有遗漏还请见谅&#xff0c;嘻嘻&#xff0c;前路漫漫&#xff0c;我们一起前进&#xff01;&#xff01;&#xff0…...

鸿蒙笔记--Socket

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

安装python+python的基础语法

安装python python2为内置&#xff0c;安装python3----3.6.8 最新安装3.12使用源码安装 1.查看yum源&#xff0c;epel [rootpython01 ~]# yum list installed |grep epel 2.安装python3 [rootpython01 ~]# yum -y install python3 3.查看版本 [rootpython01 ~]# python…...

html+css网页制作 国家体育总局2个页面模版(无js)

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

Effective Java学习笔记第27、28条原生态类型和非受检警告

目录 什么是泛型 泛型与编译器 不要轻易使用原生态类型 可以通过通配符类型来替代原生态类型 几个适合原生态类型的场景 消除非受检的警告 什么是非受检警告 如果无法消除警告 本书27-33条主要介绍泛型。首先介绍什么是泛型&#xff0c;它的应用场景是什么。然后重点介…...

javaEE和javaSE

引用自&#xff1a;https://developer.baidu.com/article/detail.html?id3312755 文章目录 前景描述javaSE简介使用场景 javaEE&#xff08;J2EE&#xff09;简介使用场景 结语 前景描述 javaEE和javaSE是java中比较常见的两个概念,但是又比较容易忘记&#xff0c;在此进行记…...

Leetcode 17.电话号码的字母组合

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

位1的个数

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

RPA在政务服务中的挑战与解决方案

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

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 中&#xff0c;这个位置有两个选项&#xff0c;分别为Debug和Release&#xff0c…...

​MySQL——索引(二)创建索引(2)使用 CREATE INDEX 语句在已经存在的表上创建索引

若想在一个已经存在的表上创建索引&#xff0c;可以使用 CREATE INDEX 语句&#xff0c;CREATEINDEX语句创建索引的具体语法格式如下所示: CREATE [UNIQUEIFULLTEXTISPATIAL]INDEX 索引名 ON 表名(字段名[(长度)J[ASCIDESC]); 在上述语法格式中&#xff0c;UNIQUE、FULLTEXT 和…...

前端HTML总结

目录 前言 正文 head SEO body 网页的主要组成元素&#xff1a; body标签中常见的标签&#xff1a; 自闭合标签&#xff1a; 无语义标签&#xff1a; 特殊符号&#xff1a; 列表 子项&#xff1a; 样式修改&#xff1a; 定义列表&#xff1a; 语义化&#xff1…...

【动态规划】647. 回文子串

力扣链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 动规大法开始吟唱&#xff1a; dp[i][j]含义&#xff1a;从i到j的子串是否为回文子串 递推公式&#xff1a;当s[i] s[j]时 1. j-i<1时, dp[i][j]为true 2. 否则&#xff0c;若dp[i1][j-1]为true&#x…...

python-约瑟夫环(赛氪OJ)

[题目描述] n 个人&#xff08; 0,1,2,3,4...n−1 &#xff09;&#xff0c;围成一圈&#xff0c;从编号为 k 的人开始报数&#xff0c;报数报到 m 的人出队。 下次从出队的人之后开始重新报数&#xff0c;循环往复&#xff0c;当队伍中只剩最后一个人的时候&#xff0c;那个人…...

Less 教程:从入门到精通

Less 教程&#xff1a;从入门到精通 1. 引言 Less 是一种流行的动态样式表语言&#xff0c;它扩展了 CSS 的功能&#xff0c;使其更加强大和灵活。通过本教程&#xff0c;我们将深入探讨 Less 的基本概念、特性以及如何在项目中实际应用它。 2. Less 的基本概念 2.1 变量 …...

单片机驱动MOS管的原理与实战技巧

1. 单片机直接驱动MOS管的原理与风险MOS管作为现代电子设计中最常用的功率开关器件&#xff0c;其控制方式看似简单却暗藏玄机。作为一名经历过多次"炸管"教训的硬件工程师&#xff0c;我想分享一些关于单片机直接驱动MOS管的实战经验。MOS管分为NMOS和PMOS两种类型&…...

​Problem - 2148F - Codeforces​[字符串后缀排序]

Problem - 2148F - Codeforces 题意很简单 我们可以随意防止字符串 按照从上到下 如果最后一层某个位置没有字符串 那么上面的字符串就会掉下来到最后一层 求字典序最小的最下层的字符串 首先 最朴素的思想 我们会找出当前最小长度的字符串 长度k 然后截取所有字符串的…...

ParquetViewer:Windows平台最友好的Parquet文件查看与查询工具

ParquetViewer&#xff1a;Windows平台最友好的Parquet文件查看与查询工具 【免费下载链接】ParquetViewer Simple Windows desktop application for viewing & querying Apache Parquet files 项目地址: https://gitcode.com/gh_mirrors/pa/ParquetViewer 还在为Wi…...

CnOpenData 沪市IPO发行文件-B来源

IPO(Initial Public Offing)&#xff0c;即首次公开募股&#xff0c;是指一家企业(发行人)第一次将它的股份向公众出售。资本市场是现代金融体系的核心&#xff0c;是企业最高效的融资渠道和最强大的资本运作平台&#xff0c;IPO作为公司登陆资本市场的唯一路径&#xff0c;将使…...

ai辅助开发:让快马平台智能诊断并生成最优的wsl ubuntu环境配置方案

在折腾开发环境配置的路上&#xff0c;相信不少朋友都踩过WSL安装Ubuntu的坑。从选择版本、处理依赖到解决网络问题&#xff0c;整个过程就像开盲盒。最近尝试用AI辅助完成这个任务时&#xff0c;意外发现了一条捷径——通过智能交互就能生成量身定制的环境方案。 传统配置的痛…...

Chrome for Testing 终极配置指南:5个实战技巧让浏览器自动化测试更高效

Chrome for Testing 终极配置指南&#xff1a;5个实战技巧让浏览器自动化测试更高效 【免费下载链接】chrome-for-testing 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-for-testing Chrome for Testing 是 GoogleChromeLabs 团队专门为浏览器自动化测试设计的…...

AI辅助开发:让快马AI理解并生成ccswitch工具的核心逻辑与UI管理代码

AI辅助开发&#xff1a;让快马AI理解并生成ccswitch工具的核心逻辑与UI管理代码 最近在开发一个网络切换工具ccswitch时&#xff0c;发现AI辅助开发能大幅提升效率。通过InsCode(快马)平台集成的AI模型&#xff0c;可以用自然语言描述需求&#xff0c;就能自动生成核心功能代码…...

OpenMS实战指南:如何用开源工具解决质谱数据分析三大难题

OpenMS实战指南&#xff1a;如何用开源工具解决质谱数据分析三大难题 【免费下载链接】OpenMS The codebase of the OpenMS project 项目地址: https://gitcode.com/gh_mirrors/op/OpenMS 你是否正在为复杂的质谱数据分析而烦恼&#xff1f;面对海量的LC-MS数据&#xf…...

从野火官方手册到实战:我的RK3568 NPU开发环境搭建全记录(含conda虚拟环境管理心得)

从野火官方手册到实战&#xff1a;我的RK3568 NPU开发环境搭建全记录&#xff08;含conda虚拟环境管理心得&#xff09; 作为一名长期在边缘计算领域折腾的开发者&#xff0c;最近终于有机会上手Rockchip的RK3568芯片。这款芯片内置的NPU&#xff08;神经网络处理单元&#xff…...

告别重复输入:快马助你打造高效openclaw命令管理工具

最近在团队协作中频繁使用openclaw工具时&#xff0c;发现每次手动输入冗长的命令参数特别容易出错&#xff0c;尤其是当需要切换不同环境配置时&#xff0c;常常因为输错一个参数导致整个流程卡住。于是决定用Python开发一个小工具来提升操作效率&#xff0c;顺便把实现过程记…...