代码随想录算法训练营第四十二天| 01背包问题 二维,01背包问题 一维,416. 分割等和子集

目录

题目链接: 01背包问题 二维

思路

代码

题目链接:01背包问题 一维

思路

代码

题目链接: 416. 分割等和子集

思路

代码

总结


题目链接:01背包问题 二维

思路

        ①dp数组,物品从下标0到i的物品中任取,然后放进容量为j的背包里,此时最大的价值

        ②递推公式,到第i个物品时有两个选择,放或者不放。如果不放,最大价值就是dp[i-1][j],说明第i个物品太大了放不下,价值还是和i-1的状态一样;如果放,最大价值就是i-1时的价值加上value[i],即dp[i-1][j-wight[i]]+value[i]。也就是说当前dp[i][j]可以由这两个状态推导而来,因为要取最大价值,所以取这两个值中的最大值

        ③dp数组初始化,由递推公式可知,dp数组当前值可由左上角和正上方两个方向推导而来, 所以只需要初始化第一列和第一行即可由递推公式得到整个二维dp数组。当背包容量为0时,放不了东西,所以这一列初始化为0;下标为物品0时,如果背包容量足够就将其初始化为物品0的价值,如果放不下就初始化为0

        ④遍历顺序,由递推公式可知,只要有左上角和上方的值即可推导当前值,所以先遍历行或者列,或者说先遍历物品或者背包都可以

        ⑤推导dp数组

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int m,n;//m为物品个数,n为背包空间
void solve(){
    vector<int> weight(m,0);//物品重量
    vector<int> value(m,0);//物品价值
    vector<vector<int>> dp(m,vector<int>(n+1,0));//dp数组
    //输入重量和价值
    for(int i = 0; i < m; i++){
        cin>>weight[i];
    }
    for(int i = 0; i < m; i++){
        cin>>value[i];
    }
    //当第一个物品的重量小于背包空间时
    //此时dp赋值为该物品的value
    for(int j = weight[0]; j <= n; j++){
        dp[0][j] = value[0];
    }
    //遍历背包
    for(int j = 0; j <= n; j++){
        //遍历物品,物品从1到i
        for(int i = 1; i < m; i++){
            if(weight[i] > j) 
                //装不下时,价值与遍历到上一个物品时一样
                dp[i][j] = dp[i-1][j];
            else
                //如果能装下,选最大值
                dp[i][j] = max(dp[i-1][j], dp[i-1][j-weight[i]]+value[i]);
        }
    }
    cout<<dp[m-1][n]<<endl;
    
}

int main(){
    while(cin>>m>>n){
        solve();
    }
    return 0;
}

题目链接:01背包问题 一维

思路

        ①dp数组,容量为j的背包,能装的物品价值最大为dp[j]

        ②递推公式,与二维类似,只不过用了一维的滚动数组。此时背包空间为j,有两个选择:装不下当前物品,则此时背包的价值与遍历上一个物品时一样,也就是dp[j] = dp[j-weight[i]];能装下时,有两种情况,装完后价值比之前大,装完后价值比之前小,肯定是二者选最大。装之前,dp[j] = dp[j-weight[i]],装之后,dp[j] = dp[j-weight[i]] + value[i]。

        ③dp数组初始化,根据递推公式可知背包空间为0时装不了物品,所以价值为0即dp[0] = 0,往后遍历时会进行更新,所以其他位置先初始化为0即可。

        ④遍历顺序,先物品,后背包,且背包倒序遍历,从空间最大往前遍历。因为是先遍历物品,如果背包正序遍历,则物品i可能会被重复放入。

        ⑤推导dp数组

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

//一维dp数组
int m,n;//m为物品种类,n为背包容量
void solve(){
    vector<int> weight(m,0);
    vector<int> value(m,0);
    //dp[n]的意义是背包容量为n的时候,所装物品的最大价值为dp[n]
    //因为dp数组从0开始,所以dp数组的大小为n+1
    vector<int> dp(n+1,0);
    //输入物品信息,重量和价值
    for(int i = 0; i < m; i++){
        cin>>weight[i];
    }
    for(int i = 0; i < m; i++){
        cin>>value[i];
    }
    //遍历顺序,先物品,后背包,其背包倒序遍历
    //由于dp数组大小有限,并不会保存上一层的信息
    //所以要先遍历物品,把当前物品处理完再进行下一层
    //背包倒序遍历是防止同一物品被多次装入背包
    for(int i = 0; i < m; i++){
        //如果能装下才对dp数组当前位置进行更新
        for(int j = n; j >=weight[i]; j--){
            dp[j] = max(dp[j],dp[j-weight[i]]+value[i]);
        }
    }
    cout<<dp[n]<<endl;
}

int main(){
    while(cin>>m>>n){
        solve();
    }
    return 0;
}

题目链接:416. 分割等和子集

思路

        将该题归类为01背包问题

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

        ①dp数组,容量为j的背包所装物品的最大价值为dp[j],本题所给的数组既是重量也是价值

        ②递推公式,dp[j] = max[dp[j], dp[j-nums[i]]+nums[i]]

        ③dp数组初始化,本题所给数组中的数都是正整数,所以初始化为0即可

        ④遍历顺序,滚动数组,先物品后背包,背包倒序

        ⑤推导dp数组

代码

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        // 计算数组中所有元素之和
        int sum = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
        }
        // 如果和为奇数,则不可能分隔,因为都是数组中都为正整数
        if (sum % 2 == 1)
            return false;
        // target为背包的容量
        int target = sum / 2;
        vector<int> dp(target + 1, 0); // 定义dp数组
        // 01背包,先物品,后背包,背包倒序遍历
        for (int i = 0; i < nums.size(); i++) {
            for (int j = target; j >= nums[i]; j--) {
                dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
            }
        }
        if (dp[target] == target)
            return true;
        return false;
    }
};

总结

        ①01背包问题,m个物品,有各自的重量和价值,背包容量为n,将物品装入到背包里,使得背包中物品的价值总和最大

        ②选择背包大小为dp数组,dp[j]的含义是背包容量为j时装入物品的最大价值

        ③再遍历dp数组时,每次都有两个选择,装与不装。当容量不足时就不装,价值与上一状态一样;当容量足够时,装入当前物品有一个价值,上一状态也有一个价值,取最大值

        ④416.分割等和子集竟然能用01背包解决,属实是意想不到

        ⑤刚开始接触背包问题,很多细节没有掌握,需要复习

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DevEco Studio mac版启动不了【鸿蒙开发Bug已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近也是遇到了这个问题,看到网上也有人在询问这个问题,本文总结了自己和其他人的解决经验,解决了【DevEco Studio mac版启动不了】的问题。 问题描述 报错如下。 -------…

【javaWeb项目】基于网页形式,通过浏览器访问的java应用程序,就称为javaweb程序

JavaWeb前端 第一章 1、javaWeb是什么 //基于网页形式&#xff0c;通过浏览器访问的java应用程序&#xff0c;就称为javaweb程序2、web程序的分类 //1、静态web程序特点&#xff1a;网页上的内容是固定不变的&#xff0c;不能动态加载&#xff0c;例如web前端//2、动态web程序…

神经网络基础(Neural net foundations)

Today we’ll be learning about the mathematical foundations of deep learning: Stochastic gradient descent (SGD), and the flexibility of linear functions layered with non-linear activation functions. We’ll be focussing particularly on a popular combination…

基于SSM的文物管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的文物管理系统拥有俩种角色 管理员&#xff1a;个人信息管理、用户管理、分类管理、文物信息管理、文物外借管理、文物维修管理、留言板管理等 用户&#xff1a;登录注册、分类…

接口测试 - postman

文章目录 一、接口1.接口的类型2. 接口测试3. 接口测试流程4. 接口测试用例1. 测试用例单接口测试用例-登录案例 二、HTTP协议1. HTTP请求2. HTTP响应 三、postman1. 界面导航说明导入 导出用例集 Get请求和Post请求的区别:2.postman环境变量和全局变量3. postman 请求前置脚本…

【webrtc】MessageHandler 4: 基于线程的消息处理:以Fake 收发包模拟为例

G:\CDN\rtcCli\m98\src\media\base\fake_network_interface.h// Fake NetworkInterface that sends/receives RTP/RTCP packets.虚假的网络接口,用于模拟发送包、接收包单纯仅是处理一个ST_RTP包 消息的id就是ST_RTP 类型,– 然后给到目的地:mediachannel处理: 最后消息消…

如何轻松在D盘新建文件夹?意外丢失的文件夹怎么找回

对于很多刚接触电脑的朋友来说&#xff0c;如何正确地新建文件夹并将其放置在特定盘符&#xff08;如D盘&#xff09;可能是一个不小的挑战。同时&#xff0c;如果新建的文件夹突然消失&#xff0c;而我们又确信自己没有删除它&#xff0c;那么该如何找回呢&#xff1f;本文将为…

想要接触网络安全,应该怎么入门学习?

作为一个网络安全新手&#xff0c;首先你要明确以下几点&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f;要学哪些东西&#xff1f;有哪些方向&#xff1f;怎么选&#xff1f;这一行职业前景如何&#xff1f; 其次&#xff0c;如果你现在不清楚学什么的话&…

微信小程序实现九宫格

微信小程序使用样式实现九宫格布局 使用微信小程序实现九宫格样式&#xff0c;可以直接使用样式进行编写&#xff0c;具体图片如下&#xff1a;1、js代码&#xff1a; Page({/*** 页面的初始数据*/data: {current: 4},// 监听activeClick(e) {let index e.currentTarget.dat…

IOT-9608I-L 的GPIO应用

目录 概述 1 GPIO接口介绍 2 板卡上操作IO 2.1 查看IO驱动 2.2 使用ECHO操作IO 2.2.1 端口选择 2.2.2 查看IO 2.2.3 echo操作IO 3 C语言实现一个操作IO的案例 3.1 功能介绍 3.2 代码实现 3.3 详细代码 4 测试 测试视频地址&#xff1a; IOT-9608I-L的一个简单测试&a…

使用Gradio搭建聊天UI实现质谱AI智能问答

一、调用智谱 AI API 1、获取api_key 智谱AI开放平台网址&#xff1a; https://open.bigmodel.cn/overview 2、安装库pip install zhipuai 3、执行一下代码&#xff0c;调用质谱api进行问答 from zhipuai import ZhipuAIclient ZhipuAI(api_key"xxxxx") # 填写…

回溯Backtracking Algorithm

目录 1) 入门例子 2) 全排列-Leetcode 46 3) 全排列II-Leetcode 47 4) 组合-Leetcode 77 5) 组合总和-Leetcode 39 6) 组合总和 II-Leetcode 40 7) 组合总和 III-Leetcode 216 8) N 皇后 Leetcode 51 9) 解数独-Leetcode37 10) 黄金矿工-Leetcode1219 其它题目 1) 入…

汽车热辐射、热传导、热对流模拟加速老化太阳光模拟器系统

汽车整车结构复杂&#xff0c;材料种类繁多&#xff0c;在使用过程中会面临各种严酷气候环境的考验&#xff0c;不可避免会出现零部件材料老化、腐蚀等不良现象&#xff0c;从而影响汽车的外观、功能&#xff0c;甚至产生安全隐患。因此&#xff0c;分析汽车零部件材料老化腐蚀…

【图论】图论基础

图论不同地方讲的不太一样&#xff0c;本文仅限作者的理解 定义 图是一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V&#xff0c;称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E&#xff0c;一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&am…

Matlab生成txt文件导入到Vivado仿真

Matlab处理数据并将其写入txt文件 %% Txt Generate pre_RS_datadec2bin(simDataIn,8); %将数据转化为8bit的二进制 fidfopen("F:\FPGA\Xilinx_vivado\project\dvbstestbench\dbvs\matlab\pre_RS_data.txt","wt"); for i1:n*nMessages %数据…

记一次使用Notepad++正则表达式批量替换SQL语句

目录 一、需求二、解决方案三、正则解析 一、需求 存在如下SQL建表脚本&#xff1a; CREATE TABLE "BUSINESS_GOODS" ( "ID" VARCHAR(32) NOT NULL, "GOODS_CODE" VARCHAR(50), "GOODS_NAME" VARCHAR(100), ... NOT CLUSTER PRIMARY…

设计模式第一次测验 | 数据库连接设计(单例模式、抽象工厂模式、工厂模式)

需求如下&#xff1a; 我们需要设计一个工具&#xff0c;它负责创建一个与数据库软件的连接池。 该工具由在容器&#xff08;Tomcat等&#xff09;内运行的应用程序用来连接数据库软件。 在同一个容器中运行的所有应用程序共享同一个连接池对象。 现在我们需要支持以下数据库软…

TCP/IP和HTTP协议

TCP/IP OSI 七层模型在提出时的出发点是基于标准化的考虑&#xff0c;而没有考虑到具体的市场需求&#xff0c;使得该模型结构复杂&#xff0c;部分功能冗余&#xff0c;因而完全实现 OSI 参考模型的系统不多。而 TCP/IP 参考模型直接面向市场需求&#xff0c;实现起来也比较…

arthas如何排除CPU使用率过高问题

1、首先启动arthas java -jar arthas-boot.jar 2、使用thread查看各线程CPU使用率 thread 可以看到CPU使用率最高的有2个线程&#xff0c;以线程ID为19的为例子&#xff1a; 输入thread 19查看线程19的堆栈信息&#xff1a; thread 19 可以看到是(CpuController.java:78行…

「C/C++ 01」类型转换与整型提升

目录 一、类型转换和截断问题 1. 隐式类型转换 2. 强制类型转换 3. 截断问题 二、整型提升 0. 算数表达式的计算过程 1. 整型提升是什么&#xff1f; 2. 为什么要整型提升&#xff1f; 3. 如何进行整型提升 4. 唯一的注意事项 5. 通过在vs中的监视窗口来观察整型提升 6. 整型…
最新文章