动态规划 0-1背包问题(滚动数组思想优化)

news2024/12/22 17:59:04

目录

125 · 背包问题(二)LintCode 炼码

           0-1背包滚动数组优化

 0-1背包问题(一)LintCode 炼码

【解法一】二维数组

【解法二】滚动数组


125 · 背包问题(二)LintCode 炼码

 

 

 

 

 

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>> dp(n+1, vector<int> (m+1, 0));
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <= m; ++j)
            {
                if(j<a[i-1])
                {
                    dp[i][j] = dp[i-1][j];
                }
                else
                {
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i-1]]+v[i-1]);
                }
            }
        }
        return dp[n][m];
    }
};

 0-1背包滚动数组优化

滚动数组思想(后无效性原则)

滚动数组是DP中的一种编程思想。简单的理解就是让数组滚动起来,每次都使用固定的几个存储空间,来达到压缩,节省存储空间的作 用。起到优化空间,主要应用在递推或动态规划中(如01背包问题)。因为DP题目是一个自底向上的扩展过程,我们常常需要用到的是连 续的解,前面的解往往可以舍去。

 注意:背包剩余容量需要从最大值开始推不然物品的小容量值会被这个物品的小容量值覆盖

 将二维数组利用滚动数组思想转入一维数组,每次都对一个一维数组进行操作,这里注意的是需要每次从数组的最后一个元素开始处理,因为如果从左往右就会出现后面元素利用本次处理后的结果,我们应该是希望对上一轮循环的结果进行重新处理,而不是使用本轮循环所更改的元素。

class Solution {
public:
    int backPackII(int m, vector<int> &a, vector<int> &v) {
        // write your code here
        int n = a.size();
        vector<int> dp(m+1, 0);
        for(int i = 1; i <= n; ++i)
        {
            // 为了防止数据被覆盖每次从最后一个元素开始算起
            for(int j = m; j >= 0; --j)
            {
                if(j>=a[i-1])
                {
                    dp[j] = max(dp[j], dp[j-a[i-1]]+v[i-1]);
                }
            }
        }
        return dp[m];
    }
};

 0-1背包问题(一)LintCode 炼码

 

【解法一】二维数组

class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param a: Given n items with size A[i]
     * @return: The maximum size
     */
    int backPack(int m, vector<int> &a) {
        // write your code here
        int n = a.size();
        vector<vector<int>> dp(n+1, vector<int> (m+1, 0));
        for(int i = 1; i <= n; ++i)
        {
            for(int j = 1; j <=m; j++)
            {
                if(j<a[i-1])
                {
                    dp[i][j] = dp[i-1][j];
                }
                else
                {
                    dp[i][j] = max(dp[i-1][j], dp[i-1][j-a[i-1]]+a[i-1]);
                }
            }
        }
        return dp[n][m];
    }
};

【解法二】滚动数组

class Solution {
public:
    int backPack(int m, vector<int> &a) {
        // write your code here
        int n = a.size();
        vector<int> dp(m+1, 0);
        for(int i=1; i<=n; ++i)
            for(int j=m; j>=1; j--)
                if(j>=a[i-1])
                dp[j] = max(dp[j], dp[j-a[i-1]]+a[i-1]);
        return dp[m];
    }
};

#include<iostream>
using namespace std;
#include<vector>
int dp[35][205];
int w[35], c[35];

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> dp(m + 1, 0);
        for (int i = 1; i <= n; ++i)
        {
            for (int j = m; j >= 0; j--)
            {
                if (j >= a[i - 1])
                {
                    dp[j] = max(dp[j], dp[j - a[i - 1]] + v[i - 1]);
                }
            }
            for (int k = 1; k <= m; k++)
                cout << dp[k] << " ";
            cout << endl;
        }
        return dp[m];
    }
};

int main()
{
    Solution s;
    vector<int> a = { 2,3,5,7 };
    vector<int> v = { 1,5,2,4 };
    s.backPackII(10, a, v);
    return 0;
}

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

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

相关文章

HADOOP-3.2.2安装

HADOOP-3.2.2安装一. 准备工作二.安装阶段1. 创建安装目录并安装解压包2.修改配置文件core-site.xml3. 修改hdfs-site.xml4. 修改修改yarn-site.xml5.修改workers文件6.修改hadoop-env.sh7.修改mapred-site.xml8.递归创建目录9.分发文件三.运行阶段1.启动hdfs2.启动yarn3.启动j…

F280049C Crossbar X-BAR

文章目录X-BAR9.1 输入X-BAR9.2 ePWM、CLB和GPIO输出X-BAR9.2.1 ePWM X-BAR9.2.1.1 ePWM X-BAR架构9.2.2 CLB X-BAR9.2.2.1 CLB X-BAR架构9.2.3 GPIO输出X-BAR9.2.3.1 GPIO输出X-BAR架构9.2.4 X-BAR标志总结X-BAR 交叉开关&#xff08;在本章中称为X-BAR&#xff09;提供了以各…

一年风雨几度寒,一杯浊酒敬虎年

我是谁大家好&#xff0c;我是凡夫贩夫&#xff0c;真实姓名不值一提&#xff0c;我的履历也很不值一提&#xff0c;非名校非大厂非专家&#xff0c;一名三非野生java开发者&#xff0c;现居住地河南郑州&#xff0c;就职于一家外包公司。的确&#xff0c;我是一个普通人&#…

(02)Cartographer源码无死角解析-(46) 2D栅格地图→CastRay()函数与贝汉明(Bresenham)算法

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

PCB设计完成后,为什么经常要拼版及拼版注意事项

通常我们在完成PCB设计的时候&#xff0c;有一些板子我们通常是需要进行拼版的&#xff0c;那么我们为什么要拼版&#xff0c;哪种情况下需要拼版呢&#xff1f;不拼是否可以呢&#xff1f;1、PCB生产制作尺寸要求 一般来说面积比较小的板子我们是需要进行拼版&#xff0c;一般…

MATLAB APP 设计实践(一)UART通信(下篇)

引言上篇介绍了 MATLAB App 的基本内容&#xff0c;本篇就结合UART发送数据的具体案例介绍开发过程。文末给出设计源文件、设计的可执行文件的下载链接&#xff0c;以及App的实际使用视频&#xff08;与FPGA开发板进行调试验证&#xff09;。前文链接&#xff1a;MATLAB APP 设…

MySQL 分区(innode引擎的讲解)

目录 一.InnoDB逻辑存储结构 段 区 页 二.分区概述 分区 三.分区类型 一.InnoDB逻辑存储结构 首先要先介绍一下InnoDB逻辑存储结构和区的概念&#xff0c;它的所有数据都被逻辑地存放在表空间&#xff0c;表空间又由段&#xff0c;区&#xff0c;页组成。 段 段就是…

【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

文章目录基本原理绘图层次定义距离基本原理 和Birch聚类相似&#xff0c;层次聚类也是一种依赖树结构实现的聚类方法&#xff0c;其核心概念是相似度。根据相似度&#xff0c;可以将所有样本组织起来&#xff0c;从而构建一棵层次聚类树。 其中Birch算法的核心&#xff0c;叫…

MyBatis【多表查询与动态SQL使用】

MyBatis【多表查询与动态SQL使用】&#x1f34e;一.MyBatis多表查询&#x1f352;1.1 一对一查询&#x1f352;1.2 一对多查询&#x1f34e;二.动态SQL使用&#x1f352;2.1 if 标签使用&#x1f352;2.2 trim 标签使用&#x1f352;2.3 where 标签使用&#x1f352;2.4 set 标…

ARX测试_绘制道路横断面

本文迁移自本人网易博客&#xff0c;写于2011年1月12日&#xff0c;ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)1、已提供道路的图形&#xff0c;获取用户输入的两点&#xff0c;并在两点间画一条虚线。计算这条直线与多少条直线相交&#xff0c;若数量不等于…

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58&#xff08; 0x33~0x3A&#xff09; 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时&#xff0c;寄存器 51 内为频率值&#xff0c;寄存器 55 内为温度值 4 通道模块时&#xff0c;寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先&#xff0c;是PMP考试的核心教材&#xff1a;《PMBOK指南》&#xff0c;目前已经出道第七版了&#xff0c;大家如果有备考的需要要赶紧买一本来学习。 其次&#xff0c;是《汪博士解读PMP》&#xff0c;目前出到第6版&#xff0c;这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在评论区中留言哦&#x1f916;&#x1f63d;&#x1f984;指南目录&#x1f4d6;&#xff1a;&#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&#xff1a;机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况&#xff0c;当监测到皮带出现撕裂跑偏时&#xff0c;立刻抓拍告警并中止皮带的运输。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面&#xff0c;最好、最容易上手的动态博客系统之一&#xff08; solo 也是&#xff09;&#xff0c;轻快&#xff0c;简洁&#xff0c;功能强大。 正文 上周末正在募集团队一起写算法题&#xff0c;群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…

MFC高级控件RichEdit2.0的使用

MFC高级控件RichEdit的使用MFC高级控件RichEdit的使用MFC控件设置焦点&#xff0c;实现回车后编辑框内容清空&#xff0c;焦点停留在该编辑框内MFC高级控件RichEdit的使用 RichEdit控件&#xff0c;可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。 效果如下&#xf…

Python--文件基本操作

文件的存储方式 在计算机中&#xff0c;文件是以 二进制的方式保存在磁盘上的 文本文件和二进制文件 文本文件 可以使用文本编辑软件查看本质上还是二进制文件二进制文件 保存的内容 不是给人直接阅读的&#xff0c;而是提供给其它软件使用的二进制文件不能使用 文件编辑软件…

NTN(一) 基本架构

R17将NTN纳入了3GPP规范&#xff0c;NTN是 non-terrestrial networks非地面网络缩写&#xff0c;通过卫星或无人机平台实现NR通信&#xff0c;在地面网络设备无法普及的地方&#xff0c;采用NTN覆盖&#xff0c;进一步提升覆盖范围。例如在沙漠、海洋等极限区域&#xff0c;采用…

TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP-数据格式 数据偏移 占4位&#xff0c;取值范围是0x0101~0x1111乘以4就是首部长度&#xff08;Header Length&#xff09; 保留 占6位&#xff0c;目前全为0 有些资料中&#xff0c…