动态规划-背包问题(二)

news2025/2/23 12:56:00

动态规划-背包问题(二)

  • 1 描述
  • 2 样例
    • 2.1 样例 1:
    • 2.2 样例 2:
    • 2.3 挑战
  • 3 算法解题思路以及实现方法
    • 3.1 算法解题思路
      • 3.1.1 确定状态
      • 3.1.2 转移方程
      • 3.1.3 初始条件和边界情况
      • 3.1.4 计算顺序
    • 3.2 空间复杂度为O(MN)的算法实现
      • 3.2.1 java实现
      • 3.2.2 C++实现
    • 3.3 空间优化后的算法实现

该题是lintcode上的125 · 背包问题(二)算法题,该题的解题思路是按照九章侯老师给的方法去实现的。

1 描述

有 n 个物品和一个大小为 m 的背包. 给定数组 A 表示每个物品的大小和数组 V 表示每个物品的价值.

问最多能装入背包的总价值是多大?

1. A[i]V[i],n,m均为整数
2. 您不能将物品进行切分
3. 您所挑选的要装入背包的物品的总大小不能超过m
4. 每个物品只能取一次
5. m <= 100,即len(a)len(v) <= 100

2 样例

2.1 样例 1:

输入:

m = 10
A = [2, 3, 5, 7]
V = [1, 5, 2, 4]
输出:

9
解释:

装入 A[1] 和 A[3] 可以得到最大价值, V[1] + V[3] = 9

2.2 样例 2:

输入:

m = 10
A = [2, 3, 8]
V = [2, 5, 8]
输出:

10
解释:

装入 A[0] 和 A[2] 可以得到最大价值, V[0] + V[2] = 10

2.3 挑战

O(nm) 空间复杂度可以通过, 你能把空间复杂度优化为O(m)吗?

3 算法解题思路以及实现方法

3.1 算法解题思路

3.1.1 确定状态

该问题主要是要知道N个物品是否可以拼出重量M,对于每个重量M,最大总价值为多少。
最后一步:最后一个物品是否需要放入背包中
选择1:如果前N - 1个物品就可以拼出重量M,最大价值为V,那么前N个物品也能拼出M且总价值为M。
选择2:如果前N - 1个物品能拼出M - An-1,最大总价值为V,则再加上最后一个物品(重An-1,价值为Vn-1),能拼出M,总价值为:V + Vn-1

设:f[i][]j表示用前i个物品拼出重量为j时的最大总价值(-1表示不能拼出j)

3.1.2 转移方程

在这里插入图片描述

3.1.3 初始条件和边界情况

  • 设:f[i][]j表示用前i个物品拼出重量为j时的最大总价值(-1表示不能拼出j)
  • f[i][w] = max{f[i-1][w], f[i-1][w-Ai-1] + Vi-1 | w≥Ai-1 且f[i-1][w-Ai-1] ≠-1}
  • 初始条件:
    • f[0][0] = 0,表示0个物品可以拼出重量为0,最大总价值为0
    • f[0][1…M] = -1,表示0个物品不能拼出重量大于0的重量
  • 边界情况:
    • f[i - 1][j - Ai-1]只能在j >= Ai-1,并且f[i - 1][j - Ai-1] != -1时使用

3.1.4 计算顺序

  • 初始化f[0][0], f[0][1], …, f[0][M]

  • 计算前1个物品可以拼出各种重量的最大总价值:f[1][0], f[1][1], …, f[1][M]

  • 计算前N个物品拼出各种重量的最大价值:f[N][0], f[N][2], …, f[N][M]

  • 最后结果为:max0<=j<=M{f[N][j] | f[N][j] ≠-1}

  • 时间复杂度为:O(MN)

  • 空间复杂度为:O(MN)

  • 空间优化后的复杂度为:O(M)

3.2 空间复杂度为O(MN)的算法实现

3.2.1 java实现

public class Solution {
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param a: Given n items with size A[i]
     * @param v: Given n items with value V[i]
     * @return: The maximum value
     */
    public int backPackII(int m, int[] a, int[] v) {
        // write your code here
        int n = a.length;
        int [][] f = new int[n + 1][m + 1];

        f[0][0] = 0;
        for (int i = 1; i <= m; i++) {
            f[0][i] = -1;
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                f[i][j] = f[i - 1][j];
                if (j >= a[i - 1] && f[i - 1][j - a[i - 1]] != -1) {
                    f[i][j] = Math.max(f[i][j], f[i - 1][j - a[i - 1]] + v[i - 1]);
                }
            }
        }

        int res = 0;
        for (int i = 0; i <= m; i++) {
            if (f[n][i] != -1) {
                res = Math.max(res, f[n][i]);
            }
        }

        return res;
    }
}

3.2.2 C++实现

class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param a: Given n items with size A[i]
     * @param v: Given n items with value V[i]
     * @return: The maximum value
     */
    int backPackII(int m, vector<int> &a, vector<int> &v) {
        // write your code here
        int n = a.size();
        vector<vector<int>> f(n + 1, vector<int>(m + 1, -1));

        f[0][0] = 0;        
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                f[i][j] = f[i - 1][j];
                if ((j >= a[i - 1]) && (f[i - 1][j - a[i - 1]] != -1)) {
                    f[i][j] = max(f[i][j], f[i - 1][j - a[i - 1]] + v[i - 1]);
                }
            }
        }

        int res = 0;
        for (int i = 0; i <= m; i++) {
            if (f[n][i] != -1) {
                res = max(res, f[n][i]);
            }
        }

        return res;
    }
};

3.3 空间优化后的算法实现

class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param a: Given n items with size A[i]
     * @param v: Given n items with value V[i]
     * @return: The maximum value
     */
    int backPackII(int m, vector<int> &a, vector<int> &v) {
        // write your code here
        int n = a.size();
        vector<int> f(m + 1, 0);

        for (int i = 1; i <= n; i++) {
            for (int j = m; j >= a[i - 1]; j--) {
                f[j] = max(f[j], f[j - a[i - 1]] + v[i - 1]);
            }
        }

        return f[m];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/625377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

卡尔曼滤波与组合导航原理(十一)区间平滑:前向滤波、反向滤波、双向区间平滑、RTS平滑

最优预测、估计与平滑之间的关系&#xff1a; 三种平滑方式&#xff1a; 函数模型和随机模型 { X k Φ k / k − 1 X k − 1 Γ k − 1 W k − 1 Z k H k X k V k { E [ W k ] 0 , E [ W k W j T ] Q k δ k j E [ V k ] 0 , E [ V k V j T ] R k δ k j E [ W k V j …

Kubernetes DashBoard

Kubernetes DashBoard 为了便于用户操作&#xff0c;k8s开发了基于Web的用户界面。方便用户容器化应用&#xff0c;还可以监控应用状态&#xff0c;执行故障排除和管理资源。 &#x1f4ca;部署DashBoard 下载yaml&#xff0c;运行DashBoard #下载yaml [rootmaster ~]# wget …

chatgpt赋能python:Python图片裁剪:让您的图片变得更完美

Python 图片裁剪&#xff1a;让您的图片变得更完美 无论您是一名摄影师、设计师、或是一名开发者&#xff0c;一张完美的图片是至关重要的。然而&#xff0c;有时候您拍摄的图片或者设计的图形可能有一些缺陷&#xff0c;例如画面不够清晰、不需要的元素等等&#xff0c;这时候…

数据结构与算法·第7章【图】

图 大部分定义都在离散数学II中学过了&#xff0c;所以对于已知或常见的我不多赘述 弧或边带权的图分别称作有向网或无向网。若边或弧的个数 e<nlogn&#xff0c;则称作稀疏图&#xff0c;否则称作稠密图。对有向图&#xff0c;若任意两个顶点之间都存在一条有向路径&…

【深蓝学院】手写VIO第3章--基于优化的 IMU 与视觉信息融合--笔记

0. 内容 1. 基于BA的VIO融合 优化的方法学会之后&#xff0c;滤波的方法也就会了。 具体的求解BA问题参考的是SBA的论文&#xff0c;使用的是LM算法&#xff08;里面有个关于权重μ的计算方法&#xff0c;不同人的实现可能不一样&#xff0c;这些都是实现细节&#xff09; …

全新 FinClip Studio 现已上线

FinClip IDE &#xff08;FinClip Integrated Development Environment&#xff0c;简称为 FIDE&#xff09;是面向开发者推出的「小程序桌面端集成开发环境」。自 2021 年起就一直陪伴来自不同平台的小程序开发者完成小程序开发、调试、预览、上传等各类功能。 随着 FinClip …

【MySQL】初识数据库

数据库基础知识 一、什么是数据库二、mysql与mysqld三、服务器、数据库、表关系四、数据库的连接、创建与使用4.1 安装地址4.2 连接服务器4.3 数据库的基本使用4.4 数据逻辑存储 五、MySQL架构六、SQL分类七、存储引擎 一、什么是数据库 存储数据用文件就可以了&#xff0c;为…

一文即可了解!Web测试(性能测试 / 界面测试 / 兼容性测试 / 安全性测试)

目录 前言&#xff1a; 一、Web性能测试&#xff1a;&#xff08;压力测试、负载测试、连接速度测试&#xff09; 二、Web界面测试&#xff1a;&#xff08;导航测试、图形测试、内容测试、整体界面测试&#xff09; 三、Web兼容性测试&#xff1a;&#xff08;平台&#x…

Linux搭建Java环境——安装MySQL5.7(CentOS7.6)

一、使用Xftp上传MySQL安装包&#xff0c;并解压 这里可以直接使用安装包也可以使用命令直接在Xshell运行 wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar 当然要提前创建好文件夹/opt/mysql&#xff0c;并cd进去&#xff0c;运行tar -xvf mysql-…

通义千问写的高考作文你觉得怎么样?

目录 一、全国卷-全国甲卷 二、北京卷 三、上海卷 今天带大家使用通义千问来体验一下2023年高考作文&#xff0c;大家一起来一睹为快吧&#xff01; 一、全国卷-全国甲卷 阅读下面的材料&#xff0c;根据要求写作。&#xff08;60分&#xff09; 人们因技术发展得以更好地掌控…

计算机网络管理-使用SNMPc开展网管活动

一、实验目的 全面学习SNMPc网络管理软件业务服务监控功能&#xff0c;了解如何使用网管软件从事网络管理工作 二、实验内容与设计思想 1&#xff09;操作映射数据库。 2&#xff09;查看管理对象的MIB数据。 3&#xff09;创建、保存长期统计数据&#xff08;要求一定时长…

django传统全栈开发一个ChatGPT应用

根据客户需求&#xff0c;开发一个能多人使用的ChatGPT平台&#xff0c;背后使用的是ChatGPT的api_key。 需求 1、可多轮对话 2、可删除对话 3、流式显示对话 4、可多人使用 5、多个api_key均衡使用 技术分析 第一次接触openai的二次开发&#xff0c;看文档、看文章&…

软件测试-金融银行项目怎么测?系统业务测试总结分析...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行测试人员的组…

《计算机组成原理》期末考试手写笔记——模块三:运算方法与运算器(变形补码计算+原码补码一位乘法计算+浮点运算)

本课程的期末考试复习笔记与你分享&#xff0c;祝你考试成功~ 目录 &#xff08;一&#xff09;知识点总结 知识点1&#xff1a;计算机中的运算&#xff08;不考&#xff09; 知识点2&#xff1a;定点加减法运算&#xff08;很简单&#xff09; 知识点3&#xff1a;定点乘法…

IDE/在VS2015中集成Qt开发环境

文章目录 概述安装VS2015安装Qt VS Tools 插件Qt相关配置应用到所有项目配置增加配置删除 VS项目属性下Qt工程配置&#xff08;Qt Project Settings&#xff09;Qt VersionsQt Modules编辑器找不到Qt的类 QtDesigner在VS下使用无法打开UI/打开失败找不到UI编译中间文件UI添加的…

package.json与package-lock.json区别需不需要被.gitignore文件忽略

前言 先要搞清楚package.json与package-lock.json文件分别是什么作用 .gitignore文件是干什么的-主页文章有 介绍 package.json 1.项目名称版本号&#xff0c;描述&#xff0c;以及运行命令和一些配置的node环境命令 2.记录那些包会在开发环境中用到&#xff0c;哪些包会…

【项目】从零实现一个高并发内存池

目录 一、项目介绍 1、该项目的原型 2、该项目所涉及到的技术及博主往期参考文章 3、池化技术 4、内存池的内碎片和外碎片 二、先来看一个定长内存池设计 三、高并发内存池的三层框架设计 1、thread cache的实现 1.1thread cache整体框架 1.2哈希桶映射对齐规则 1.3…

【送书福利-第九期】Web安全攻防从入门到精通

大家好&#xff0c;我是洲洲&#xff0c;欢迎关注&#xff0c;一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我&#xff01; 本文目录 一、前言二、内容介绍三、作者介…

【LeetCode】768. 最多能完成排序的块 II

768. 最多能完成排序的块 II&#xff08;困难&#xff09; 思路 对于已经分好块的数组&#xff0c;若块数大于 1&#xff0c;则可以得到以下结论&#xff1a;「 右边的块的所有数字均大于或等于左边的块的所有数字」。考虑这个问题&#xff1a;对于已经分好块的数组&#xff0…

Linux——多线程互斥

多线程互斥 抢票问题互斥锁锁的接口 理解锁锁的背景概念如何看待锁&#xff1a;加锁和解锁的原理锁的封装 可重入与线程安全死锁死锁的概念与条件 抢票问题 这里用上一篇&#xff1a; https://blog.csdn.net/qq_63580639/article/details/131054847?spm1001.2014.3001.5501 的…