数学建模__动态规划

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


问题描述:给定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}

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

相关推荐
lqqjuly6 分钟前
MLA — 多头潜在注意力深度解析
深度学习·神经网络·算法
吴可可12326 分钟前
SolidWorks草图转三维DWG技巧
算法
redaijufeng1 小时前
C++雾中风景7:闭包
c++·算法·风景
小欣加油1 小时前
leetcode287寻找重复数
数据结构·c++·算法·leetcode
尽兴-2 小时前
2.1 向量基础:Embedding、余弦相似度、欧氏距离、向量检索
算法·embedding·欧氏距离·向量检索·余弦相似度
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM训推一体工作站赋能多行业智能化升级
人工智能·算法·自动化
怪兽学LLM3 小时前
LeetCode 438 找到字符串中所有字母异位词(Python 固定滑动窗口+字符计数解法)
python·算法·leetcode
满怀冰雪3 小时前
第04篇-双指针算法-从有序数组到回文判断的高频解法
java·算法
CC数学建模3 小时前
2026年江西省研究生数学建模竞赛1题:空间数据分析中的过拟合识别完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
leo__5203 小时前
MATLAB实现牧羊人算法
开发语言·算法·matlab