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

news2025/3/14 10:30:37

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

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

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

1 描述

给定 n 种物品, 每种物品都有无限个. 第 i 个物品的体积为 A[i], 价值为 V[i].

再给定一个容量为 m 的背包. 问可以装入背包的最大价值是多少?

不能将一个物品分成小块.
放入背包的物品的总大小不能超过 m.

2 样例

2.1 样例 1:

输入: A = [2, 3, 5, 7], V = [1, 5, 2, 4], m = 10
输出: 15
解释: 装入三个物品 1 (A[1] = 3, V[1] = 5), 总价值 15.

2.2 样例 2:

输入: A = [1, 2, 3], V = [1, 2, 3], m = 5
输出: 5
解释: 策略不唯一. 比如, 装入五个物品 0 (A[0] = 1, V[0] = 1).

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

3.1 算法解题思路

3.1.1 确定状态

该算法题和背包问题(二)不同的点是每种物品有无穷多个。
其解题思路也和背包问题(二)很类似。
在这里插入图片描述

3.1.2 转移方程

因为每个物品有无穷多个,所以Ai有无穷多个,既,可以用0个Ai, 1个Ai, 2个 Ai,…
在这里插入图片描述
在这里插入图片描述

3.1.3 初始条件以及边界情况

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

3.2.1 java实现的O(MN)算法复杂度

public class Solution {
    /**
     * @param a: an integer array
     * @param v: an integer array
     * @param m: An integer
     * @return: an array
     */
    public int backPackIII(int[] a, int[] v, int m) {
        // write your code here
        int n = a.length;
        if (n == 0) {
            return 0;
        }

        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][j - a[i - 1]] != -1) {
                    f[i][j] = Math.max(f[i][j], f[i][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++实现的O(MN)算法复杂度

class Solution {
public:
    /**
     * @param a: an integer array
     * @param v: an integer array
     * @param m: An integer
     * @return: an array
     */
    int backPackIII(vector<int> &a, vector<int> &v, int m) {
        // write your code here
        int n = a.size();
        if (n <= 0) {
            return 0;
        }

        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][j - a[i - 1]] != -1) {
                    f[i][j] = max(f[i][j], f[i][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.2.3 空间复杂度优化为O(m)

class Solution {
public:
    /**
     * @param a: an integer array
     * @param v: an integer array
     * @param m: An integer
     * @return: an array
     */
    int backPackIII(vector<int> &a, vector<int> &v, int m) {
        // write your code here
        int n = a.size();
        if (n <= 0) {
            return 0;
        }

        vector<int> f(m + 1, -1);
        f[0] = 0;

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

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

        return res;
    }
};

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

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

相关文章

Lua基本语法

目录 1 lua基础数据结构 2 Lua 变量 3 Lua 循环 3.1 Lua while 循环 3.2 Lua for 循环 数值for循环 泛型for循环 3.3 Lua repeat...until 循环 3.4 Lua 循环嵌套 3.5 循环控制语句 Lua break 语句 Lua goto 语句 4 Lua 流程控制 4.1 Lua if 语句 4.2 Lua if...else 语…

04-编织灵魂旋律:Golang 函数的魔力绽放

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

常见网络设备及其功能

1.常见网络设备及其功能 笔记来源&#xff1a; Computer network components and their functions 设备工作所在层隔离冲突域隔离广播域路由器(Router)网络层√√网桥(Bridge)数据链路层√交换机(Switch)数据链路层√中继器(Repeater)物理层集线器(Hub)物理层 1.1 路由器&…

chatgpt赋能python:Python并排输出数字——快速高效的实现技巧

Python并排输出数字——快速高效的实现技巧 在Python编程中&#xff0c;我们经常需要对数字进行输出&#xff0c;并排输出数字是一种非常常见的需求。比如说&#xff0c;我们需要将多个数据进行比较&#xff0c;或者需要将多个相关数据进行显示&#xff0c;等等。本文将介绍Py…

一.基于压缩感知(CS)的DOA估计方法-OMP-CS算法

阅读须知&#xff1a; 1.本文为本人原创作品仅供学习参考&#xff0c;未经过本人同意禁止转载和抄袭。 2.要想无障碍阅读本文需要一定的压缩感知理论以及压缩感知信号重构算法基础。 3.话不多说&#xff0c;直接开搞。 1 基于压缩感知DOA估计方法原理 假设有K个远场窄带信号…

dpdk21.11 编译(meson+ninja)及VFIO模块的加载和运行

目录 前言 安装前的环境配置 编译流程 1. 设置环境变量&#xff08;好像也不需要了&#xff09; 2. 构建dpdk 3. 编译 执行测试 1. 绑定vfio-pci 模块 2. 挂载网卡 3. 设置大页 4. 启动测试程序-testpmd 前言 操作系统&#xff1a;ubuntu22.04.2 LTS 内核版本&#…

深入理解 Java ServiceLoader、Dubbo ExtensionLoader 源码结合实战篇

介绍Java SPIDriver 实现类DriverManager 驱动管理器类loadInitialDrivers 方法registerDriver 方法getConnection 方法 ServiceLoader 核心类LazyIterator#hasNextService 方法LazyIterator#nextService 方法 Dubbo SPI加载策略FilterExtensionLoaderExtensionLoader#getExten…

框架篇面试详解

spring AOP AOP称为面向切面编程&#xff0c;用于将那些与业务无关&#xff0c;但却对多个对象产生影响的公共行为和逻辑&#xff0c;抽取并封装成为一个可重用的模块&#xff0c;这个模块被命名为“切面”&#xff08;Aspect&#xff09;&#xff0c;减少系统中的重复代码&am…

02-舞动数据类型:Golang 类型定义的奇妙之旅

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;Golang基础 &#x1f4ac;Go&#xff08;又称Golang&#xff09;是由Google开发的开源编程语言。它结合了静态类型的安全性和动态语言的灵活性&#xff0c;拥有高效的并发编程能力和简洁的语法。G…

chatgpt赋能python:Python如何建设网页并实现客户端与服务器端的通信

Python如何建设网页并实现客户端与服务器端的通信 介绍 Python是一种流行的编程语言&#xff0c;被广泛应用于Web开发。在Web开发中&#xff0c;Python可以用来建立并联接网页与服务器端的通信。 这篇文章将介绍如何使用Python建立网页&#xff0c;并展示如何实现客户端与服…

Science Advance||个体脑中鲁棒的动态脑网络

文章目录 个体化动态方法&#xff08;INSCAPE 方法&#xff09;&#xff1a;&#xff08;A&#xff09;生成脑共同激活状态的组模板&#xff1a;&#xff08;B&#xff09;个体水平分析&#xff1a; 不同的大脑状态有特定的协同激活模式&#xff08;coactivation patterns&…

IntSet

基本概述 IntSet是Redis中set集合的一种实现方式&#xff0c;基于整数数组来实现&#xff0c;并且具备长度可变、有序等特征。 结构如下&#xff1a; typedef struct intset {uint32_t encoding; /* 编码方式&#xff0c;支持存放16位、32位、64位整数&#xff08;4字节32比特…

chatgpt赋能python:Python如何并排输入数字

Python如何并排输入数字 Python是一个功能强大的编程语言&#xff0c;可以用于各种用途&#xff0c;包括数据分析、机器学习、Web开发等。对于很多初学者来说&#xff0c;学会如何并排输入数字可能是一个基础的技巧。在本文中&#xff0c;我们将介绍如何使用Python在同一行中输…

RK3588平台开发系列讲解(USB篇)USB 常用调试方法

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、USB枚举成功标志二、USB speed查询三、USB 查询PID、VID四、USB 当前 端口组合五、USB 动态打印debug日志六、USB IPC log分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要 介绍 USB 常用调试…

安卓期末考试知识总结(2)

文章目录 第四章&#xff1a;程序活动单元Activity四大组件Activity生命周期Activity的启动模式standardsingleTopsingleInstancesingleTask IntentIntentFilterActivity之间的数据传递putExtra()方法传递数据Bundle类传递数据Activity之间的数据回传 练习总结 第四章&#xff…

Java虚拟机原理

Java是一种跨平台的语言&#xff0c;这意味着Java开发出来的程序经过编译后&#xff0c;可以在Linux上运行&#xff0c;也可以在Windows上运行&#xff1b;可以在PC、服务器上运行&#xff0c;也可以在手机上运行&#xff1b;可以在X86的CPU上运行&#xff0c;也可以在ARM的CPU…

chatgpt赋能python:Python引入Math库的使用方法

Python引入Math库的使用方法 Python作为一门强大的编程语言&#xff0c;有着广泛的应用场景。在计算领域中&#xff0c;Python也有很多优秀的库来进行相应的计算。其中一个广泛使用的库就是Math库。这个库包含了很多数学函数&#xff0c;如三角函数、幂函数、对数函数等等。在…

剑指offer21.调整数组顺序使奇数位于偶数前面

毫无难度。 class Solution {public int[] exchange(int[] nums) {int i 0;int size nums.length;int[] res new int[size];int jsize-1;for(int k 0; k<size;k){if(nums[k]%2 0){res[j]nums[k];j--;}else{res[i]nums[k];i;}}return res;} }

关于 Ceph 存储集群配置的一些笔记

写在前面 Ceph 考试整理笔记&#xff0c;老师总结基础上&#xff0c;略有补充博文内容涉及&#xff1a; ceph 集群的配置简单介绍永久和零时修改集群配置文件集群 Mon 的配置集群身份验证的配置集群多网络的配置 理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有…

Mysql 索引调优

前言 索引是帮助MySQL高效获取数据的数据结构 常用索引 1、普通索引 普通索引是最基本的索引&#xff0c;仅用于加速查询&#xff0c;没有任何限制&#xff1a;可以为空、可以重复 2、唯一索引 唯一索引与普通索引类似&#xff0c;但索引列的值必须唯一 3、主键索引 主…