算法系列--动态规划--背包问题(3)--完全背包介绍

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

💕"Su7"💕
作者:Lvzi
文章主要内容:算法系列–动态规划–背包问题(3)–完全背包介绍
动态规划完全背包问题,算法,动态规划

大家好,今天为大家带来的是算法系列--动态规划--背包问题(3)--完全背包介绍

一.完全背包问题

链接:
完全背包

动态规划完全背包问题,算法,动态规划
可以发现完全背包问题和01背包问题还是特比相似的

分析:

完全背包问题01背包问题的推广,是以01背包问题为基础,两种问题的状态表示是相同的

  • dp[i][j]:在[1,i]所有物品中,在不超过体积j的前提下,可以实现的最大价值

分析状态转移方程时也是以最后一个位置的状态去划分,分为选/不选nums[i],此处就体现出完全背包问题和01背包问题最大的差别,01背包问题如果选择nums[i],选择的物品的数量只能是1(+w[i]),但是完全背包问题如果选择nums[i],可以选择的数量是任意多个(+n * w[i]),此时的状态是任意多个,这样的状态我们在正则表达式匹配那道问题中已经遇到过,解决思路就是利用数学规律,将任意多个状态使用简单的几个状态表示,具体操作是观察所有状态中不变的量,大胆假设,小心求证!!!

以下是状态转移方程的推导:
动态规划完全背包问题,算法,动态规划

动态规划完全背包问题,算法,动态规划

  • dp[i][j] = Max(dp[i-1][j],dp[i][j - nums[i]] + w[i])

初始化

  • 根据状态表示分析出不需要初始化

返回值:

  • dp[n][V]

代码:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 1.解决第一问
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 获取物品数目和体积

        int[] v = new int[n + 1], w = new int[n + 1];
        for(int i = 1; i <= n; i++) {
            v[i] = in.nextInt();// 物品体积
            w[i] = in.nextInt();// 物品价值
        }

        int[][] dp = new int[n + 1][V + 1];
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i-1][j];
                if(j - v[i] >= 0)
                    dp[i][j] = Math.max(dp[i][j],dp[i][j - v[i]] + w[i]);
            }
        }

        System.out.println(dp[n][V]);

        // 1.解决第二问
        dp = new int[n + 1][ V + 1];// 好的代码风格?
        for(int j = 1; j <= V; j++) dp[0][j] = -1;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= V; j++) {
                dp[i][j] = dp[i - 1][j];
                if(j - v[i] >= 0 && dp[i][j - v[i]] != -1)
                    dp[i][j] = Math.max(dp[i][j],dp[i][j - v[i]] + w[i]);
            }
        }
        System.out.println(dp[n][V] == -1 ? 0 : dp[n][V]);
    }
}

空间优化:
同样的在完全背包问题中也可以进行空间优化(想想01背包问题中的空间优化,通过明确遍历顺序,只是用一个简单的线性数组就可以完成填表)

01背包问题的空间优化最需要注意的就是遍历顺序的改变,在01背包问题中,为了在填表的时候需要使用的数据不被覆盖掉,需要从右往左遍历,但是在完全背包问题中,需要从左往右遍历
动态规划完全背包问题,算法,动态规划

空间优化后的代码:

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        // 1.解决第一问
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), V = in.nextInt();// 获取物品数目和体积

        int[] v = new int[n + 1], w = new int[n + 1];
        for(int i = 1; i <= n; i++) {
            v[i] = in.nextInt();// 物品体积
            w[i] = in.nextInt();// 物品价值
        }

        int[] dp = new int[V + 1];
        for(int i = 1; i <= n; i++)
            for(int j = v[i]; j <= V; j++)
                dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);

        System.out.println(dp[V]);

        // 2.解决第二问
        dp = new int[ V + 1];// 好的代码风格?
        for(int j = 1; j <= V; j++) dp[j] = -1;
        for(int i = 1; i <= n; i++)
            for(int j = v[i]; j <= V; j++)
                if(dp[j - v[i]] != -1)
                    dp[j] = Math.max(dp[j],dp[j - v[i]] + w[i]);
            
        System.out.println(dp[V] == -1 ? 0 : dp[V]);
    }
}

以上就是算法系列--动态规划--背包问题(3)--完全背包介绍全部内容,下一篇文章将会带来完全背包问题的拓展题目,敬请期待,我是LvZi文章来源地址https://www.toymoban.com/news/detail-858013.html

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

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

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

相关文章

  • 算法篇——动态规划 完全和多重背包问题 (js版)

    算法篇——动态规划 完全和多重背包问题 (js版)

    01 背包 问题和 完全背包 问题的不同点在于,所有的物品只能 使用一次 ,判断  哪些物品  装进背包里 物品价值和 最大;而 完全背包 问题中,所有物品都能 使用n次 ,判断 哪个物品 装 n 个进去 物品价值和 最大。 01 背包的递推公式是: 【当然先遍历物品还是背包的容量

    2024年02月08日
    浏览(14)
  • 力扣算法刷题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日
    浏览(43)
  • 动态规划:完全背包问题

    动态规划:完全背包问题

    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日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包