动态规划之二维数组系列——01背包,不同的子序列

2023-11-06

01背包问题

题目描述
小明有一个容量为 V 的背包。
这天他去商场购物,商场一共有 N 件物品,第 i 件物品的体积为 wi,价值为 vi。
小明想知道在购买的物品总体积不超过 V 的情况下所能获得的最大价值为多少。

解题思路
现假设 V 为 7,N 为 4,他们的 w 分别为 1,3,4,5 。v 分别为1,4,5,7。
要想解决这个问题可以先建立一个 N 行 V 列的二位数组,即解决此问题的dp数组,值为此时背包可装下物品的最大价值。

解题过程
当背包容积为0时,无法装下任意体积的商品,故第一列全为零,即最大价值为0。
现在我们逐行进行遍历:

(1)当背包容积为1时,我们发现刚好可以装下第一个物品(体积为1),此时背包可装物品的最大价值为1,第一行都是这种情况。
(2)第二行,当背包容量为1,2时,不能选择装入第一个物品(因为w2=3大于此时背包容量),故此时能装入的最大价值和上一行一样,即dp[i][j]=dp[i-1][j]。
(3)当体积为3时,此时是可以装下第二个物品的,但是要分两种情况讨论:1.装第二个物品;2.不装第二个物品。
情况1:装下第二个物品后,背包剩余体积为 j-w[2]=0,此时不能再装下其他物品了,故该情况的最大价值为4。
情况2:不装第二个物品,此时的最大价值和上一行一样,即dp[i][j]=dp[i-1][j],即为1.

总结:通过比较两种情况发现,情况1的价值(val=4)比情况2的价值(val=1)大,所以这里选择装第二件物品,转化为dp公式就是:dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+val[i])。
(到这里可能就有小伙伴不理解 dp[i][j-w[i]]+val[i] 了,别急!听我细细道来!)

显而易见,dp[i][j-w[i]]+val[i]中的 +val[i] 部分就是刚刚的情况2,那为什么要有前面的 dp[i][j-w[i]] 呢?
刚刚情况2直接得出最大价值val[2]是4,没有 dp[i][j-w[i]] 是因为装下第二件物品后背包的剩余容易为零了。我们再看刚刚的dp[i][j-w[i]] 不就是dp[2][0]=0吗?所以刚刚情况2的完整写法应该是最大价值是0+4=4。

在这里插入图片描述
关键代码

for (int i = 1; i <= n; i++) {
   	for (int j = 1; j <=v; j++) {
        if(wei[i]>j) {
            dp[i][j]=dp[i-1][j];
        }else {
            dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-wei[i]]+val[i]);
        }
    }
}

完整代码

import java.util.Scanner;

public class Main {
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int v=sc.nextInt();
        int[][] dp=new int[n+1][v+1];
        int[] val=new int[n+1];
        int[] wei=new int[n+1];
        for (int i = 1; i < n+1; i++) {
            wei[i]=sc.nextInt();
            val[i]=sc.nextInt();
        }
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <=v; j++) {
                if(wei[i]>j) {
                    dp[i][j]=dp[i-1][j];
                }else {
                    dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-wei[i]]+val[i]);
                }
            }
        }
        System.out.println(dp[n][v]);
    }
}

相关练习
蓝桥杯练习——小明的背包1
力扣——115.不同的子序列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动态规划之二维数组系列——01背包,不同的子序列 的相关文章

  • 动态规划算法(背包问题)

    1 应用场景 背包问题 背包问题 有一个背包 容量为4磅 现有如下物品 1 要求达到的目标为装入的背包的总价值最大 并且重量不超出 2 要求装入的物品不能重复 2 动态规划算法介绍 1 动态规划 Dynamic Programming 算法
  • 最长公共上升子序列(LCIS)

    前置知识 LCS LIS 注意 刚开始看这个问题的时候 第一反应是先求出LCS再求出LCS的LIS 事实上这是有问题的 我们并不能保证这么求出的LCIS是最长的 比如下面这个例子 Example a 7 1 5 6 4 2 7 b 7 1
  • 2023华为OD机试真题(java 100%通过)【最多获得的短信条数/动态规划】

    题目内容 某云短信厂商 为庆祝国庆 推出充值优惠活动 现在给出客户预算 和优惠售价序列 求最多可获得的短信总条数 输入描述 第一行客户预算M 其中 0 M 10 6 第二行给出售价表 P1 P2 Pn 其中 1 n 100 Pi为充值 i
  • LeetCode312. 戳气球 (分治,记忆化搜索,动态规划)

    LeetCode312 戳气球 解题思路 记忆化搜索 动态规划 解题思路 官方题解 参考题解 核心思想 由于戳气球的操作会导致两个气球从不相邻变成相邻 使得后续操作难以处理 于是我们倒过来看这些操作 将全过程看成每次添加一个气球 solve
  • 数学建模常用的四大模型

    目录 1 评价模型 2 优化模型 3 分类模型 4 预测模型 本文主要介绍数学建模的四大模型分类 分别是评价模型 优化模型 分类模型 预测模型 关注公众号 数模乐园 回复 买 获得更多数模教程 1 评价模型 评价模型可以处理难于完全定量分析
  • 国王和金矿问题

    国王和金矿问题 描述 有一个国家发现了max n座金矿 参与挖矿工人的总数是max people人 每座金矿的黄金储量不同为一维数组gold 需要参与挖掘的工人数也不同为一维数组peopleNeed 每座金矿要么全挖 要么不挖 不能派出一半
  • LeetCode64. 最小路径和

    题目大意 求出从网络左上角到右下角的一条代价最小的路径和 题目分析 使用动态规划 求出左上角到网络中每个点的代价最小路径和 假设当前要求的是point i j 点 那么它的值就应该是从左上角到它上面那个点point i 1 j 的路径和 与
  • 华为od机考题目-HJ68-成绩排序(比较难)

    while 1 try count int input reverse True if input 0 else False temp lt
  • 【编程之路】面试必刷TOP101:动态规划(67-71,Python实现)

    面试必刷TOP101 动态规划 67 71 Python实现 67 不同路径的数目 一 小试牛刀 67 1 递归 首先我们在左上角第一个格子的时候 有两种行走方式 如果向右走 相当于后面在一个 n 1
  • leetcode-动态规划【背包问题】

    背包问题篇 基础背包 416 分割等和子集 1049 最后一块石头的重量ii 494 目标和 474 一和零 完全背包 518 零钱兑换ii 377 组合总和iv 70 爬楼梯 322 零钱兑换 279 完全平方数 139 单词拆分 多重背
  • 动态规划算法解决背包问题(Java实现)

    文章收藏的好句子 你在书本上花的任何时间 都会在某一个时刻给你回报 目录 1 动态规划算法的概述 2 背包问题 3 动态规划算法解决背包问题 3 1 不可重复装入商品 3 2 思路分析 1 动态规划算法的概述 1 动态规划算法的思想是 将大
  • 代码随想录算法训练营第十九天

    动态规划系列5 6 7 8 377 组合总和 未看解答自己编写的青春版 重点 代码随想录的代码 我的代码 当天晚上理解后自己编写 求排列数的题 用二维DP过不了 自己捋逻辑的话 也是可以觉得有漏洞 但是怎么修改 一下子还没思路 包括后面的
  • POJ-1458最长公共子序列

    给定序列的子序列是给定序列 其中遗漏了一些元素 可能没有 给定序列X
  • leetcode动态规划总结之01背包和完全背包问题

    1 背包问题分类 其中 除了01背包和完全背包外 leetcode题目中好像还没有涉及其他类型的背包 在这里我就不做总结 2 01背包理论 有N件物品和一个最大承载重量为W 的背包 第i件物品的重量是weight i 其价值是value i
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • HJ103 Redraiment的走法

    Redraiment是走梅花桩的高手 Redraiment可以选择任意一个起点 从前到后 但只能从低处往高处的桩子走 他希望走的步数最多 你能替Redraiment研究他最多走的步数吗 示例 2 5 1 5 4 5 输出 3 说明 6个点的
  • OD机试题目【计算网络信号】

    网络信号经过传递会逐层衰减 且遇到阻隔物无法直接穿透 在此情况下需要计算某个位置的网络信号值 注意 网络信号可以绕过阻隔物 array m n 的二维数组代表网格地图 array i j 0代表i行j列是空旷位置 array i j x x
  • 华为od机考真题-数据分类

    while 1 try c b nums list map int input split dp
  • leetcode-712. 两个字符串的最小ASCII删除和

    712 两个字符串的最小ASCII删除和 题目 给定两个字符串s1 和 s2 返回使两个字符串相等所需删除字符的 ASCII 值的最小和 示例1 输入 s1 sea s2 eat 输出 231 解释 在 sea 中删除 s 并将 s 的值
  • Python之动态规划

    序言 最近在学习python语言 语言有通用性 此文记录复习动态规划并练习python语言 动态规划 Dynamic Programming 动态规划是运筹学的一个分支 是求解决策过程最优化的过程 20世纪50年代初 美国数学家贝尔曼 R

随机推荐