动态规划-背包问题-完全背包

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

题目描述

对比01背包,完全背包中的每件物品有无数件。

也就是说,每件物品可以拿0,1,…,k,…件。

状态(和01背包一样)

dp[i][j]表示前i种物品,体积为j时的最大价值

状态转移

  • 对于第i件物品:
    • 不拿:dp[i][j]⇐dp[i-1][j]
    • 拿一件:dp[i][j]⇐dp[i-1][j-w[i]]+v[i]
    • 拿两件:dp[i][j]⇐dp[i-1][j-2w[i]]+2v[i]
    • 拿k件:dp[i]][j]⇐dp[i-1][j-kw[i]]+kv[i]

状态转移方程

  • d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − k ∗ w [ i ] ] + k ∗ w [ i ] ) , k = 1 , . . . , j w [ i ] dp[i][j]=max(dp[i-1][j],dp[i-1][j-k*w[i]]+k*w[i]),k=1,...,\frac{j}{w[i]} dp[i][j]=max(dp[i1][j],dp[i1][jkw[i]]+kw[i]),k=1,...,w[i]j
  • 展开 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w [ i ] ] + v [ i ] , d p [ i − 1 ] [ j − 2 ∗ w [ i ] ] + 2 ∗ v [ i ] , . . . ) ( 1 + j w [ i ] 项 ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i],dp[i-1][j-2*w[i]]+2*v[i],...)(1+\frac{j}{w[i]}项) dp[i][j]=max(dp[i1][j],dp[i1][jw[i]]+v[i],dp[i1][j2w[i]]+2v[i],...)(1+w[i]j)
  • d p [ i ] [ j − w [ i ] ] = m a x ( d p [ i − 1 ] [ j − w [ i ] ] , d p [ i − 1 ] [ j − 2 ∗ w [ i ] ] + ∗ v [ i ] , . . . ) ( j w [ i ] 项 ) dp[i][j-w[i]]=max(dp[i-1][j-w[i]],dp[i-1][j-2*w[i]]+*v[i],...)(\frac{j}{w[i]}项) dp[i][jw[i]]=max(dp[i1][jw[i]],dp[i1][j2w[i]]+v[i],...)(w[i]j)
  • 综上可得dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i])
  • 直观上理解为:前一项表示不取第i种,后一项表示在先前的基础上取第i种(取多次)

代码

n,V=map(int,input().split())
dp=[[0]*(V+1) for _ in range(n+1)]
for i in range(1,n+1):
    w,v=map(int,input().split())
    for j in range(V+1):
        if j<w:
            dp[i][j]=dp[i-1][j]
        else:
            dp[i][j]=max(dp[i-1][j],dp[i][j-w]+v)
print(dp[n][V])

滚动数组优化

i-1,j
i,j-w[i] i,j

可见,更新dp[i][j]时,用的是同一行先前位置dp[i][j-w[i]]和上一行对应位置的dp[i-1][j],和01数组不同在于更新方向。

使用单个数组更新时,采用从小到大的方向对dp数组进行覆盖。文章来源地址https://www.toymoban.com/news/detail-844506.html

n,V=map(int,input().split())
dp=[0]*(V+1) 
for i in range(1,n+1):
    w,v=map(int,input().split())
    for j in range(w,V+1):
        dp[j]=max(dp[j],dp[j-w]+v)
print(dp[V])         

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

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

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

相关文章

  • 蓝桥杯算法全集之多重背包问题I(动态规划算法)

    蓝桥杯算法全集之多重背包问题I(动态规划算法)

    有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 s i 件,每件体积是 v i ,价值是 w i 。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 用下面这个图来分别动态规划的四个经典背包问题 定义状态的含义(这一步需要

    2023年04月08日
    浏览(8)
  • 力扣算法刷题Day44|动态规划:完全背包问题 零钱兑换II 组合总和Ⅳ

    力扣题目:#518.零钱兑换II(完全背包组合问题) 刷题时长:7min 解题方法:动态规划(完全背包) 复杂度分析 时间复杂度: O(mn),其中 m 是amount,n 是 coins 的长度 空间复杂度: O(m) 问题总结 对递推公式的理解 本题收获 题意转换:纯完全背包是凑成背包最大价值是多少,而本

    2024年02月13日
    浏览(14)
  • 动态规划-背包问题-完全背包

    对比01背包,完全背包中的每件物品有无数件。 也就是说,每件物品可以拿0,1,…,k,…件。 dp[i][j]表示前i种物品,体积为j时的最大价值 对于第i件物品: 不拿:dp[i][j]⇐dp[i-1][j] 拿一件:dp[i][j]⇐dp[i-1][j-w[i]]+v[i] 拿两件:dp[i][j]⇐dp[i-1][j-2w[i]]+2v[i] … 拿k件:dp[i]][j]⇐dp[i

    2024年04月08日
    浏览(11)
  • 完全背包&多重背包问题(动态规划)

    完全背包问题: 每个物品使用次数没有限制,与0-1背包的不同之处在于 遍历背包的顺序 是正序。 多重背包问题: 与完全背包的区别在于,每一种物品是有个数限制的,不能无限选择。这篇博客讲解的非常详细,可以参考学习: 多重背包问题---超详细讲解+优化(不懂你揍我

    2024年04月10日
    浏览(11)
  • 动态规划之背包问题——完全背包

    算法相关数据结构总结: 序号 数据结构 文章 1 动态规划 动态规划之背包问题——01背包 动态规划之背包问题——完全背包 动态规划之打家劫舍系列问题 动态规划之股票买卖系列问题 动态规划之子序列问题 算法(Java)——动态规划 2 数组 算法分析之数组问题 3 链表 算法

    2024年02月03日
    浏览(15)
  • 算法竞赛必考算法——动态规划(01背包和完全背包)

    算法竞赛必考算法——动态规划(01背包和完全背包)

    1.1题目介绍 1.2思路一介绍(二维数组) 代码如下: 1.3思路二介绍(一维数组) 空间优化   为什么可以使用一维数组?   我们先来看一看01背包问题的状态转移方程,我们可以发现 f[i]只用到了f[i-1],其他的是没有用到的,我们可以用滚动数组来做。   还有一个原因就是我

    2024年02月02日
    浏览(9)
  • 【动态规划之完全背包问题】完全背包问题的通用解法与优化

    【动态规划之完全背包问题】完全背包问题的通用解法与优化

    ⭐️ 前面的话 ⭐️ 本篇文章将介绍动态规划中的背包问题——完全背包问题,前面我们已经介绍了0-1背包问题,其实完全背包问题就只改了0-1背包问题的一个条件,即物品可选择次数由一次改为无数次,仅此而已,下面我们就来开始介绍完全背包问题。 📒博客主页:未见

    2023年04月22日
    浏览(44)
  • 动态规划:完全背包问题

    动态规划:完全背包问题

    ACwing #3. 完全背包问题 完全背包问题和01背包问题很相似。 01背包问题每个物品只能选一个,而完全背包问题每个物品可以选无限次。 DP问题的关键是找到状态转移方程: ①定义f[i][j]表示从前 i 个物品中选择,体积为 j 的时候的最大价值。 ②那么转移方程f[i][j] = max(f[i - 1][j

    2023年04月19日
    浏览(15)
  • 动态规划——完全背包问题

    动态规划——完全背包问题

    由于本人实力尚浅,接触算法没多久,写这篇blog仅仅是想要提升自己对算法的理解,如果各位读者发现什么错误,恳请指正,希望和大家一起进步。(●’◡’●) 了解完全背包问题前可以先去看看01背包问题(良心正解),先了解这个基础问题会更有利于你了解下面的完全背

    2024年02月04日
    浏览(7)
  • 动态规划完全背包问题-java

    动态规划完全背包问题-java

    完全背包问题跟01背包问题思路大致一样,只不过对于物品的拿取次数不在限制,我们只需要考虑这点即可。 文章目录 前言 一、什么是完全背包问题? 二、问题模拟 1.样例数据 2.算法思路 三、代码如下 1.代码如下(示例): 2.读入数 3.代码运行结果 总结 完全背包问题跟

    2024年04月26日
    浏览(16)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包