动态规划-01背包问题(python)

这篇具有很好参考价值的文章主要介绍了动态规划-01背包问题(python)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对于动态规划问题,就是牺牲空间来提高时间,通过将一个个小问题的答案存储起来,直接供给后面问题求解,避免重复的运算,从而提高效率,这就是动态规划的思想。

下面我们通过一个经典的01背包问题来了解动态规划的解题方法吧(文末附上完整代码)

首先,将每个物品的体积以及价值存放在列表中,代码和运行结果如下:

动态规划-01背包问题(python)

 动态规划-01背包问题(python)

可以看到,我们将三个物品信息放入列表中,第一个元素用[0,0]占位,使列表下标就是物品对应的序号,便于我们对代码的理解。

接下来我们将列表arr和背包容量bag传入函数进行运算,函数代码如下:

动态规划-01背包问题(python)

首先创建一个列表value,一共(bag+1)列,len(arr)行,先全部填充为0

背包容量
物品 0 1 2 3 4 5
0 0 0 0 0 0 0
1 0 2 2 2 2 2
2 0 2 3 5 5 5
3 0 2 4 6 7 9

该表格即为在不同背包容量下的物品价值表,0行即为前零个物品放入背包的价值,所以为0。1行为第一个物品放入背包的价值。二行为物品一和物品二放入背包的情况。3行即为物品一二三放入背包的情况。最大价值就如表中为9的单元格,对应的就是背包容量为五,考虑三个物品放入的最大价值。

对于画出这样的一个价值表,我们就得找出他的状态转移方程,这里我们利用代码中定义的数据来进行解释:

                我们传入的arr[]列表包含了N个物品,每个物品的下标从1-N,物品包含两个数据,一个为体积,一个为价值。例如[1,2],1为体积,2为价值。我们就可以通过下标访问每个物品的体积与价值。

                我们用循环遍历来对列表value赋值,用i控制行,j控制列(i,j都是从1开始)

                对于物品放入的情况有两种,当j(背包容量)<第i个物品的体积时,第i个物品无法放入背包,所以最大价值就是在该容量下放入前(i-1)物品的价值,此时有方程:

                value[i][j]=value[i-1][j]                                (1)

                当背包容量大于i的体积时,可以放入i号物品,此时最大价值为

                 value[i][j]=max(value[i-1][j],value[i-1][j-arr[i][0]]+arr[i][1])        (2)

                对于这个方程的解读,我的理解是:选择如(1)式不放入i,或者放入i时的最大值。对于放入i的公式解读如下:

                若要放入i,则需要留出i对应的空间大小arr[i][0](留出空间后的空间大小为:j-arr[i][0]),此时剩下的空间放前(i-1)个物品,便可以通过查表读取前i-1个物品在j-arr[i][0]背包容量下的最大价值,再加上i物品的价值arr[i][1],即使加入i物品的价值,再与value[i-1][j]比较,填入较大的一个。

最后创建的最大价值列表如下:(第二栏)

动态规划-01背包问题(python)

完整代码如下:

def backpack(arr,bag):        #创建在不同物品和背包容量下能装物品最大价值表
    value = [[0 for j in range(bag+1)] for i in range(len(arr))]#先全部填入0
    #第一行第一列为0,意思是在0个物品或0容量背包下总价值为0
    for i in range(1,len(arr)):
        for j in range(1,bag+1):
            if j<arr[i][0]:
                value[i][j]=value[i-1][j]
            else:
                value[i][j]=max(value[i-1][j],value[i-1][j-arr[i][0]]+arr[i][1])
    return value        #返回所有组合的价值表

wupin=[]
arr=[[0,0]]
N=int(input("请输入物品个数N:"))
bag=int(input("请输入背包容量(kg):"))
for i in range(N):
    zf = input(f"请输入第{i+1}个物品信息:(体积 价值)")
    mass = zf.split(' ')
    for j in mass:
        j= int(j)
        wupin.append(j)
    arr.append(wupin)           #创建一个列表,对应每一个物品信息
    wupin = []
print(arr)              #打印物品信息列表

value=backpack(arr,bag)
print(value)

有不足之处,还望指正!

 文章来源地址https://www.toymoban.com/news/detail-461477.html

 

 

到了这里,关于动态规划-01背包问题(python)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划:01背包问题(二)

    上篇博客动态规划:01背包问题(一)将的是用二维数组来解决,而本篇博客就是把二维dp数组降为一维dp数组(滚动数组)在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 其实可以发现如果 把dp[i - 1]那一层拷贝到dp[i]上 ,表达式完全可以是

    2024年01月22日
    浏览(48)
  • 动态规划——01背包问题

    由于本人实力尚浅,接触算法没多久,写这篇blog仅仅是想要提升自己对算法的理解,如果各位读者发现什么错误,恳请指正,希望和大家一起进步。(●’◡’●) 状态表示 :用一个数组 f[][] (数组可能是一维也可能是二维,根据具体题目具体分析)来表示某个集合,这个集合

    2024年02月03日
    浏览(33)
  • 动态规划_01背包问题

    描述 一个旅行者有一个最多能装   M   公斤的背包,现在有   n   件物品,它们的重量分别是   W 1 ​ , W 2 ​ , ... , W n ​ , 它们的价值分别为   C 1 ​ , C 2 ​ , ... , C n ​ ,求旅行者能获得最大总价值。 输入描述 第 1 行:两个整数, M   (背包容量, M ≤ 200   )和   N  

    2024年04月29日
    浏览(28)
  • 【动态规划】01背包问题

    动态规划是一种非常常见的算法,不论是在我们平时刷题的过程中还是在竞赛中,总会见到动态规划的身影,而动态规划又分为很多种,其中01背包问题是非常典型的一类动态规划问题。如果大家之前没有了解过动态规划,建议大家先去学习学习动态规划,直接开始01背包问题

    2024年04月15日
    浏览(38)
  • 动态规划-01背包问题

    算法思路: 背包问题的状态表⽰⾮常经典,如果⼤家不知道怎么来的,就把它当成⼀个「模板」记住吧~ 我们先解决第⼀问: 1. 状态表⽰ : dp[i][j] 表⽰:从前 i 个物品中挑选,总体积「不超过」 j ,所有的选法中,能挑选出来 的最⼤价值。 2. 状态转移⽅程 : 线性 dp 状态

    2024年04月11日
    浏览(33)
  • 动态规划(01背包问题)

    本文默认读者具有动态规划前置知识 动态规划的特点: 重叠子问题 状态转移方程 最优子结构 题型: 求最值 解题套路: 明确【状态】 明确【选择】 明确dp函数/数据的定义 明确base case 例:给你一个可装载容量为W的背包和N个物品,每个物品有重量和价值两个属性。其中第

    2024年04月16日
    浏览(29)
  • 算法系列--动态规划--背包问题(1)--01背包介绍

    💕\\\"趁着年轻,做一些比较cool的事情\\\"💕 作者:Lvzi 文章主要内容:算法系列–动态规划–背包问题(1)–01背包介绍 大家好,今天为大家带来的是 算法系列--动态规划--背包问题(1)--01背包介绍 背包问题是动态规划中经典的一类问题,经常在笔试面试中出现,是非常 具有区分度 的题

    2024年04月16日
    浏览(37)
  • 01背包问题(动态规划)(详细图解)

    目录 题目: 题解: 图表解析:  详细例子: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式: 第一行两个整

    2024年02月03日
    浏览(31)
  • [动态规划] 01背包问题及其优化

    题目描述 给一个能承重V的背包,和n件物品,我们用重量和价值的二元组来表示一个物品,第i件物品表示为(Vi,Wi),问:在背包不超重的情况下,得到物品的最大价值是多少? 输入 第一行输入两个数 V,n,分别代表背包的最大承重和物品数。 接下来n行,每行两个数Vi,W

    2024年02月03日
    浏览(32)
  • C++ 动态规划 01背包问题

    有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi ,价值是 wi 。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整数, N,V ,用空格隔开,分别表示物品数量和背

    2024年04月27日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包