首页 > 编程语言 >Python动态规划

Python动态规划

时间:2024-08-06 20:52:40浏览次数:16  
标签:背包 容量 Python int range 物品 动态 规划 dp

Python动态规划

动态规划(Dynamic Programming,简称DP)是解决多阶段决策过程最优化问题的一种方法。

动态规划算法的基本思想是:
将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;
对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,让以后再次遇到时直接引用答案,不必重新求解。
动态规划算法将问题的解决方案视为一系列决策的结果

1.斐波那契数列

斐波那契数列公式为: $F(n)=F(n−1)+F(n−2)$
初始化第1项和第2项为1
求该数列第n项

递归解法

class Solution:
    def Fibonacci(self, n: int) -> int:
        if n <= 2:
            return 1
        else:
            return self.Fibonacci(n - 1) + self.Fibonacci(n - 2)

遍历解法

class Solution:
    def Fibonacci(self, n: int) -> int:
        if n <= 2:
            return 1
        else:
            a, b = 1, 1
            for _ in range(2, n):
                a, b = b, a + b
            return b

动态规划解法

  • 定义状态: 定义状态dp[i],表示斐波那契数列的第 i 项的值
  • 状态转移方程: 根据斐波那契数列的定义,可以得到状态转移方程: dp[i] = dp[i - 1] + dp[i - 2]
  • 边界条件: 初始条件为dp[0] = 0dp[1] = 1
class Solution:
    def Fibonacci(self, n: int) -> int:
        if n <= 2:
            return 1
        dp = [0 for i in range(n + 1)]
        dp[1] = 1
        for i in range(2, n + 1):
            dp[i] = dp[i - 1] + dp[i - 2]
        return dp[n]

2. 0/1背包问题

给定一个容量为 M 的背包,以及 n 个物品,每个物品有一个重量 w[i] 和一个价值 c[i] 。要求在不超过背包容量的前提下,选择物品使得总价值最大。

【输入】
第1行: 两个整数,M表示背包容量,n表示物品数量。
第2~n+1行: 每行两个整数wi、ci,表示每个物品的重量和价值。
【输入样例】

10 4
2 1
3 3
4 5
7 9

构建动态规划表

假设有以下物品和背包容量:

物品 重量 w[i] 价值 c[i]
1 2 1
2 3 3
3 4 5
4 7 9

背包容量 M = 10

填充动态规划表来计算最大价值:

dp[i][j] 0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 1 1 1 1 1 1 1 1 1
2 0 0 1 3 3 4 4 4 4 4 4
3 0 0 1 3 5 5 6 8 8 9 9
4 0 0 1 3 5 5 6 9 9 10 12

最终,dp[4][10] = 12,表示在不超过重量 10 的情况下,能获得的最大价值为 12

  • 定义状态: dp[i][j] 表示前i个物品中,背包最大载重为j的情况下,最大价值的总和
  • 状态转移方程:
    如果不选择第i个物品 dp[i][j]=dp[i - 1][j]
    如果选择第i个物品 dp[i][j]=dp[i - 1][j - w[i]] + c[i]
    可得 $dp[i][j] = \max(dp[i-1][j], dp[i-1][j - w[i]] + c[i])$
  • 边界条件:
    dp[0][j] = 0 (没有物品时,最大价值为 0)
    dp[i][0] = 0 (背包容量为 0 时,最大价值为 0)

代码实现

# 读取背包容量 M 和物品数量 n
M, n = map(int, input().split())

# 初始化物品重量和价值数组,长度为 n+1,初始值为0
w = [0] * (n + 1)
c = [0] * (n + 1)

# 读取每个物品的重量和价值
for i in range(1, n + 1):
    w[i], c[i] = map(int, input().split())

# 初始化 dp 数组,dp[i][j] 表示前 i 个物品在容量为 j 时的最大价值
dp = [[0 for _ in range(M + 1)] for _ in range(n + 1)]

# 动态规划求解
for i in range(1, n + 1):  # 遍历每个物品
    for j in range(1, M + 1):  # 遍历每个容量
        if j < w[i]:  # 当前容量不够放下第 i 个物品
            dp[i][j] = dp[i - 1][j]
        else:  # 当前容量可以放下第 i 个物品,取最大值
            dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - w[i]] + c[i])

# 查看动态规划表
for i in range(n + 1):
    for j in range(M + 1):
        print(dp[i][j], end=" ")
    print()

# 输出最大价值
print(dp[n][M])

参考资料:

  1. https://blog.csdn.net/qq_37756660/article/details/137475180
  2. 听懂不翻车系列之--背包问题

标签:背包,容量,Python,int,range,物品,动态,规划,dp
From: https://www.cnblogs.com/rustling/p/18345959

相关文章

  • 动态规划之——背包DP(进阶篇)
    文章目录概要说明多重背包(朴素算法)模板例题思路code多重背包(二进制优化)模板例题思路code多重背包(队列优化)模板例题思路混合背包模板例题思路code1code2二维费用背包模板例题思路code概要说明本文讲多重背包、混合背包以及二维费用背包,至于其他背包问题后续......
  • python-分享篇-英文短文自动分词写入文本文件
    文章目录准备代码效果准备代码importstringf=open('./data/split.txt')s=f.read()str1=s.title()print(str1)print("".join([sforsinstr1.splitlines(True)ifs.strip()]))list1=str1.split()#采用默认分隔符进行分割#字符串列表去重l1=list(s......
  • 【学习笔记】Matlab和python双语言的学习(最大最小化规划)
    文章目录前言一、最大最小化规划二、选址问题三、代码实现----Matlab1.Matlab的`fminimax`函数2.Matlab代码四、代码实现----python总结前言通过模型算法,熟练对Matlab和python的应用。学习视频链接:https://www.bilibili.com/video/BV1EK41187QF?p=28&vd_sour......
  • 关于简单的部分数学函数用python求导的示例
    1.求常数的导数题目代码1.求常数的导数:$f(x)=c$ 运行代码fromsympyimport*x,c=symbols('xc')c.diff(x)结果 2.求幂函数导数:题目代码2.求幂函数导数:$$f(x)=x^\mu$$运行代码fromsympyimport*x,mu=symbols('xmu')(x**mu).diff(x)结果  3.求三角......
  • 动态贝叶斯网络DBN介绍
    动态贝叶斯网络DBN介绍1.引言2.贝叶斯网络与动态贝叶斯网络2.1贝叶斯网络简介2.2动态贝叶斯网络详细介绍2.3两种网络对比3.搭建动态贝叶斯网络的方法3.1定义网络结构3.2参数学习3.3推理3.4结构学习和参数学习的方法3.4.1结构学习3.4.2参数学习4.总结5.......
  • 一名优秀的AI产品经理成长规划?普通人如何入门?
    最近听到很多人在谈论跳槽面试。其中最多的莫过于在面试中,HR问的:你的职业规划是什么?如果你入职了,在这个岗位想达到怎样的目标?打算如何达到你的目标?你最近3年的职业规划是怎样的?今天跟大家一起探讨探讨:一个产品经理的职业生涯规划,应该是怎么样的?简单来说,产品经理的......
  • 【Spring源码分析】Spring Scope功能中的动态代理 - Scoped Proxy
    本文基于Springboot3.3.2及Springcloud2023.0.1版本编写。SpringScopedProxy是什么在使用Springcloud配置中心动态配置更新功能时,笔者发现在给一个类加上@RefreshScope注解后,其中@Value注入的字段会被自动更新。起初笔者以为Spring在收到配置更新事件后会自动设置该bean的......
  • 使用python解决一些计算 我们代码不比计算机差!
    使用python解决一些计算我们代码不比计算机差!一.简单基础计算1.基本的计算符号加+减-乘*****除/取余%乘方******整除//加减乘除不必多说说说比较陌生的取余乘方与整除取余%:10%3-->110-3-3-3=1最后剩下的数就是余数整除//:10//3-->310除3=3.333333去掉......
  • python 音频处理(2)——提取PPG特征之whisper库的使用(2.1)
    提取PPG特征之——whisper库的使用(2.1)1安装对应的包方法一(自用):直接pip即可:pipinstallopenai-whisper成功后如下图所示方法二:当时用了他这个方法环境直接崩了,已老实condainstall-cconda-forgeffmpegcondainstall-cconda-forgepoetrypoetryinitpoetry......
  • 18.python语句
    if语句一、if语句的介绍1、if单分支2、if的多分支3、if的嵌套4、三目运算=================================二、实操1、if单分支格式:if条件:执行语句1else执行语句2案例1在if语句判断中:我们可以使用比较运算符、成员运算符、逻辑运算符等,<,==,!=,>=,<=、and......