数学建模__动态规划

动态规划就是,将任务每一步均记录下来,以便将来重复使用时能够直接调用


问题描述:给定n个物品,每个物品的重量是Wi,价值是Vi,但是背包最多能装下capacity重量的物品,问我们如何选择才能利益最大化。


这里涉及到建模过程,本文章主要讲解代码实现,建模过程较为简略。


使用dpij来表示在容量为j的情况下,前i件物品的最大化利益。

情况一:放入第i件物品前,发现j<weighti,因此dpij此时仍然是dpi-1j(也就是dpij没有发生变化)。

情况二:放入第i件物品时,发现j >= weighti,此时你放入这件物品与否要看放进去以后利益是如何变化的。

①不放入,那么dpij的值还是dpi-1j。

②放入,那么dpij的值是dpi-1j-weight\[i]+valuei。(想一想对不对)

那么具体实现代码如下

py 复制代码
weight = [1,2,5,6,7,9]
value = [1,6,18,22,28,36]

num = 6
capicity = 13


def fun(num, capicity, weight, value):
    #构造一个num+1行,capicity+1列的二维数组
    #便于下标从1开始使用
    dp = np.array([[0]*(capicity+1)]*(num+1))
 

    #dp[i][j]表示第前i件物品在容量为j下的最大价值
    #最终需要知道dp[num][capicity]也就是dp[6][13],在容量为13情况下前6件物品的最大价值是多少。
    #进一步的需要知道dp[][]
    for i in range(1,num+1):
        for j in range(1, capicity+1):
            if j >= weight[i-1]:
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i-1]]+price[i-1])
            else:
                dp[i][j] = dp[i-1][j]

    print(dp)

fun(num, capicity, weight, value)

核心就在于这个动态转移方程。

d p i j = m a x { d p i − 1 j , d p i − 1 j − w e i g h t \[ i ] + v a l u e i } dpij = max\{dpi-1j,dpi-1j-weight\[i]+valuei\} dpij=max{dpi−1j,dpi−1j−weight\[i]+valuei}

虽写下这篇笔记,但有关动态规划的问题还需多多研究,加深理解。

相关推荐
GoAI3 小时前
DeepSeek Harness Memory (一)主流记忆插件总结
后端·算法·面试
Pniubi3 小时前
力扣54.螺旋矩阵
算法·leetcode·矩阵
choumou_M6 小时前
算法_1:由浅入深学习快速排序QuickSort
学习·算法·排序算法
Coder_Shenshen7 小时前
罗克韦尔ACD工程归档离线变量树解析
算法·c#
心仪久了会沦陷8 小时前
C语言数据结构入门——树与二叉树详解:概念、堆实现与链式遍历
c语言·数据结构·算法
小此方8 小时前
[算法实战论:动态规划]背包问题概念,01不满背包问题,01满背包问题,背包问题的滚动数组空间优化
算法·动态规划
悠仁さん9 小时前
【C++】哈希表
c++·算法·散列表
地平线开发者10 小时前
点云算法整理与常用计算模块:从数据到模型,再到工程与量化
算法·自动驾驶
武子康12 小时前
H3-World 为何在加载 LoRA 前,先检查导入的代码?
人工智能·深度学习·算法