【动态规划篇】背包问题

简介: 【动态规划篇】背包问题

👉背包问题👈


有 n 个物品和一个大小为 m 的背包,给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值。问最多能装入背包的总价值是多大?


思路

2cdabb7ed6f1491fb245f13a73c7c93b.png


class Solution 
{
public:
    int backPackII(int m, vector<int> &a, vector<int> &v) 
    {
        int n = a.size();   // 商品个数
        vector<vector<int>> maxValue(n + 1, vector<int>(m + 1, 0)); // 初识状态
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= m; ++j)
            {
                if(a[i - 1] <= j)   // 第i个物品能放入大小为j的背包,可以放入也可以不放入
                {
                    maxValue[i][j] = max(maxValue[i - 1][j], maxValue[i - 1][j - a[i - 1]] + v[i - 1]);
                }
                else    // 第i个商品不能放入大小为j的背包
                {
                    maxValue[i][j] = maxValue[i - 1][j];
                }
            }
        }
        return maxValue[n][m];
    }
};


空间复杂度优化


通过上面的分析,当前行当前列的值取决于上一行当前列的值和上一行某一列的值,所以我们只需要保存上一行的值就行了,而保存上一行的值只需要一维数组就可以保存下来了,就相当于将原来的二维数组压缩成了一维数组。如果不能放入第 i 个物品时,此时的最大价值还不需要改变。还有一个值得注意的问题:更新最大价值需要从后向前更新,因为当前的最大价值是取决于上一次循环得到的最大价值,所以前面的上一次得到的最大价值不能先修改。所以上面的代码,我们可以优化成下面的样子。


class Solution 
{
public:
    int backPackII(int m, vector<int> &a, vector<int> &v) 
    {
        int n = a.size();
        vector<int> maxValue(m + 1, 0);
        for(int i = 1; i <= n; ++i)
        {
            for(int j = m; j > 0; --j)
            {
                // 能放入第i个物品时,可以放入也可以不放入
                // 不能放入第i个物品时,不需要修改最大价值
                if(a[i - 1] <= j)   
                {
                    maxValue[j] = max(maxValue[j], maxValue[j - a[i - 1]] + v[i - 1]);
                }   
            }
        }
        return maxValue[m];
    }
};


👉总结👈


那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️




















相关文章
|
缓存 中间件 测试技术
SOME/IP协议实践指南:精选开发与测试工具解析
SOME/IP协议实践指南:精选开发与测试工具解析
874 0
|
编解码
MATLAB | 科研绘图第十七期双Y轴图
MATLAB | 科研绘图第十七期双Y轴图
329 0
|
2月前
|
运维 Kubernetes 监控
K8s 管理平台怎么选?Rancher、OpenShift、kOps、EKS、GKE —— 运维视角下的真相对比
K8s 管理平台怎么选?Rancher、OpenShift、kOps、EKS、GKE —— 运维视角下的真相对比
226 17
|
机器学习/深度学习 C语言
【C语言篇】循环语句详解(超详细)
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环.
495 1
|
安全 Linux 网络安全
Linux 多种方式实现文件共享(一)VSFTP4
【8月更文挑战第4天】Linux系统中VSFTP(Very Secure FTP)服务的配置方法,涵盖匿名访问、本地用户登录及虚拟用户管理等场景。VSFTP作为增强版FTP服务器,具备较高安全性,如普通用户权限运行、命令整合、chroot限制等特性。文中详细说明了配置步骤,包括安装VSFTP、修改主配置文件(如启用被动模式、设置端口范围)、创建用户及家目录、设置虚拟用户认证数据库等。此外,还介绍了如何实现FTP服务的加密传输,通过生成SSL证书并配置VSFTP以支持安全连接。这些配置适用于不同需求的文件共享服务。
272 4
|
人工智能 自然语言处理 Linux
免费ChatGPT4o灵办AI可体验浏览器插件
灵办AI就是您所需的最佳助手!我们为您带来了一款多功能AI工具,ChatGPT4o不仅能为您提供精准翻译,还能满足您的对话需求、智能续写、AI搜索、文档阅读、代码生成与修正等多种需求。灵办 AI,真正让工作和学习变得轻松高效!一款多功能智能助手,旨在提升工作和学习效率。它提供实时翻译、对话问答、搜索、写作和网页阅读等服务,支持多种浏览器和操作系统,帮助用户随时获取信息,打破语言障碍,优化内容创作和信息处理。
469 0
|
人工智能 数据挖掘 数据安全/隐私保护
【程序人生】公众号往期回顾如何设置
本文介绍了如何设置微信公众号的往期回顾功能,包括登录公众平台,进入素材管理,创建图文消息,编辑标题、封面和正文,添加往期回顾标签,以及保存和发布。强调了选择合适发布时间、定期更新内容和分析数据以优化策略的重要性。记得在新文章发布时同步推送往期回顾,提升用户对公众号历史内容的了解。
【程序人生】公众号往期回顾如何设置
|
存储 JSON Java
【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析(三)
在 Go 语言里,符合语言习惯的做法是使用一个单独的返回值来传递错误信息。
421 0
|
人工智能 自然语言处理 机器人
B端Agent的机会,不在于“助手”,而在基于垂直领域的任务式Agent微调
该文讨论了AI助手在企业服务中的应用,指出通用的“助手”Agent(如Coze、钉钉)在B端业务场景中表现一般,因为它们依赖用户正确指导且易发散。相比之下,任务式Agent(如TFlow)针对特定行业和场景进行微调,能更好地理解和执行复杂任务,具有更高准确性和稳定性,适合企业业务流程。TFlow的优势包括场景微调、优化流程处理,开发和使用成本较低,能直接解决实际业务问题。作者认为,B端Agent的机会在于为企业降低成本或增加效益,而任务式Agent通过微调形成的适配性成为其核心竞争力。
|
关系型数据库 MySQL 测试技术
sysbench 对MySQL压测100分钟的命令
使用 `sysbench` 对 MySQL 数据库进行性能测试(压测)时,首先确保 `sysbench` 和 MySQL 数据库已经安装,并且你有一个测试数据库可以使用。下面是一个针对 MySQL 数据库进行压测的示例命令,测试时长为 100 分钟(6000 秒)。 在运行此命令之前,请确保以下内容: - 使用适当的数据库连接参数(主机、端口、用户名、密码、数据库名)。 - 根据你的需求调整测试参数(如并发数、线程数、事务数等)。 以下是一个示例命令,使用 `sysbench` 对 MySQL 数据库进行压测 100 分钟: ```shell sysbench --db-driver=m
396 0

热门文章

最新文章