数学建模__动态规划

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


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


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


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

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

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

①不放入,那么dp[i][j]的值还是dp[i-1][j]。

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

那么具体实现代码如下

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 ] } dp[i][j] = max\{dp[i-1][j],dp[i-1][j-weight[i]]+value[i]\} dp[i][j]=max{dp[i−1][j],dp[i−1][j−weight[i]]+value[i]}

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

相关推荐
Loo国昌2 分钟前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain
Zach_yuan4 分钟前
面向对象封装线程:用 C++ 封装 pthread
开发语言·c++·算法
安特尼1 小时前
X 推荐算法分析
算法·机器学习·推荐算法
witAI2 小时前
游戏竞技动态漫制作2025指南,如何打造高质量动态漫作品
动态规划
罗湖老棍子2 小时前
强迫症冒险家的任务清单:字典序最小拓扑排序
数据结构·算法·图论·拓扑排序
不穿格子的程序员3 小时前
从零开始写算法——回溯篇4:分割回文串 + N皇后
算法·深度优先·dfs
ScilogyHunter3 小时前
qBI有什么用
算法·qbi
龙山云仓3 小时前
No131:AI中国故事-对话荀子——性恶论与AI约束:礼法并用、化性起伪与算法治理
大数据·人工智能·深度学习·算法·机器学习
夏鹏今天学习了吗3 小时前
【LeetCode热题100(90/100)】编辑距离
算法·leetcode·职场和发展
芒克芒克4 小时前
数组去重进阶:一次遍历实现最多保留指定个数重复元素(O(n)时间+O(1)空间)
数据结构·算法