LintCode领扣 题解丨大厂经典动态规划:背包问题

简介: LintCode领扣 题解丨大厂经典动态规划:背包问题

在n个物品中挑选若干物品装入背包,最多能装多满?假设背包的大小为m,每个物品的大小为A[i]。

你不可以将物品进行切割。
在线评测地址:
https://www.lintcode.com/problem/backpack/?utm_source=sc-tianchi-sz0821

样例 1:

输入:  [3,4,8,5], backpack size=10
输出:  9

样例 2:

输入:  [2,3,5,7], backpack size=12
输出:  12

算法:DP

从已知的题目中,可以总结出以下两点:

每件物品只有一种
每件物品最多选择一次
那么考虑对于前i件的物品在容量为w的背包下,最大的装载量是多少,由此可以总结出对应的子结构,进行动态规划。

算法思路

设计dp数组dpn,用dpi表示第i个物品在容量为j的背包下,最大的装载量。

在这个问题中,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i−1件物品的问题:

如果不放第i件物品,可得dpi=dpi−1
如果放了第i件物品,可得dpi=dpi−1]+A[i] (j≥A[i])
总结状态转义方程为:dpi=max(dpi−1,dpi−1]+A[i])

复杂度分析

n表示物品件数,m表示背包容量

时间复杂度:O(nm)
空间复杂度:O(nm)
算法优化观察上方的状态转义方程,可以发现dpi方程的两个状态都只和dp[i-1]有关,显然通过O(nm)的空间复杂度,难免会浪费一些空间。

可以考虑使用滚动数组优化,建立dp数组dp[m],使用dp[j-A[i]]代替dpi-1]。优化后状态转义方程为dp[j]=max(dp[j],dp[j−A[i]]+A[i])

优化后复杂度分析

时间复杂度:O(nm)

空间复杂度:O(m)

代码思路分析

建立数组dp[m]表示背包容量为m的情况下,最大的装载量
初始化dp[0]=0
正序枚举A[i],并倒叙枚举j,这样所需要的dp[j-A[i]]不会被提前更新
最后返回dp[m],表示背包容量在m下的答案
public class Solution {

/**
 * @param m: An integer m denotes the size of a backpack
 * @param A: Given n items with size A[i]
 * @return: The maximum size
 */
public int backPack(int m, int[] A) {
    // write your code here
    // 如果背包容量或者物品数量为0,则直接返回
    if (A.length == 0 || m == 0) {
        return 0;
    }
    int n = A.length;
    int[] dp = new int[m + 1];
    for (int i = 0; i < n; i++) {
        // 滚动数组优化 倒序枚举j
        for (int j = m; j >= A[i]; j--) {
            dp[j] = Integer.max(dp[j], dp[j - A[i]] + A[i]);
        }
    }
    return dp[m];
}

}
更多大厂面试动态规划题解参见九章算法官网:
https://www.jiuzhang.com/course/76/?utm_source=sc-tianchi-sz0821

相关文章
|
SDN 网络虚拟化 网络架构
在单交换机局域网中,不同网段的主机通信探秘🌐
在理解局域网中不同网段主机之间的通信之前,我们首先要明白网络的基本组成和工作原理。局域网(LAN)是一个封闭的网络环境,通常由交换机(Switch)作为核心设备连接网络中的各个主机。当我们谈论不同网段的主机时,实质上是在讨论它们配置的IP地址属于不同的IP地址范围。现在,**假设我们有两台主机(主机A和主机B),它们连接到同一个交换机,但配置在不同的网段上。问题来了:这两台主机能够直接通信吗**?🤔
在单交换机局域网中,不同网段的主机通信探秘🌐
|
存储 SQL druid
什么是Druid
什么是Druid
5695 1
什么是Druid
|
算法 计算机视觉 网络架构
YOLOv7 | 模型结构与正负样本分配解析
YOLOv7 | 模型结构与正负样本分配解析
2234 0
YOLOv7 | 模型结构与正负样本分配解析
|
5月前
|
人工智能 自然语言处理 安全
2025年企业如何选择智能客服系统:企业级智能客服系统推荐
在数字化转型加速的今天,智能客服已成为企业提升服务效率与客户体验的核心工具。本文系统梳理主流智能客服解决方案,重点解析阿里云旗下瓴羊Quick Service如何依托通义大模型,实现全渠道、全链路、全场景的智能化服务升级,助力企业从“拥有”到“用好”,真正释放智能客服的增长潜力。
|
存储 JSON 数据格式
Python环境变量
Python环境变量
546 5
|
人工智能 数据可视化 IDE
AI编程:cursor使用教程
这是小卷对AI编程工具学习的首篇文章,以Cursor为例,介绍其安装与基本功能。Cursor分为狭义和广义两类,前者辅助程序员高效编程,后者让无基础用户也能创建应用。文章详细讲解了Cursor的安装、快捷键、代码生成、修改、补全及项目理解等功能,并展示了如何通过提示词实现需求,帮助小白轻松上手编程。
3228 77
|
Cloud Native Java Go
解决Nacos配置刷新问题: 如何启用配置刷新功能以及与`@RefreshScope`注解的关联问题
解决Nacos配置刷新问题: 如何启用配置刷新功能以及与`@RefreshScope`注解的关联问题
1820 0
|
缓存 安全 Linux
Linux 设备驱动程序(二)(上)
Linux 设备驱动程序(二)
236 1
|
Java Linux 开发工具
OpenOffice4: 软件包安装, Docker安装,集成SpringBoot应用
OpenOffice4: 软件包安装, Docker安装,集成SpringBoot应用
OpenOffice4: 软件包安装, Docker安装,集成SpringBoot应用
|
JSON 监控 Java
Java中如何解决JsonProcessingException异常?
Java中如何解决JsonProcessingException异常?

热门文章

最新文章