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

news2024/11/15 17:51:40

01背包:n种物品,每种物品只有1个,有相应的重量和价值

最多只能装m的重量,最多价值为多少?

dp[i][j] : [0, i]物品任取放进容量为j的背包里

不放物品i:dp[i-1][j]

放物品i:dp[i-1][j-weight[i]] + value[i]

        dp[i-1][j-weight[i] - 不放物品i的时候(容量腾出i),所放的最大价值

        value[i] - 把i物品放进去,最终最大价值

递推公式:放i和不放i两种情况

dp[i][j] = max( dp[i-1][j], dp[i-1][j-weight[i]] + value[i])

初始化:i是物品,j是重量,初始化第一行和第一列

根据递推公式:

        dp[i-1][j] - 上方

        dp[i-1][j-weight[i]] + value[i] - 左上方

第一列:容量是0,初始化成0

第一行:根据物品0来进行初始化

其他位置:任意值

 遍历:

先背包再物品都可以

DP41 【模板】01背包

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

int main() {
    int bageweight = 0; // 背包重量
    int size = 0; // 物品数量
    cin >> size >> bageweight;

    vector<int> weight(size, 0);
    vector<int> value(size, 0);
    for(int i=0; i<size; ++i) {
        cin>>weight[i];
        cin>>value[i];
    }

    // 定义dp数组:表示 [0, i]物品任取,背包容量为j的最大价值
    vector<vector<int>> dp(size, vector<int>(bageweight+1, 0));
    // 初始化:第一行
    for(int i=weight[0]; i<=bageweight; ++i) {
        dp[0][i] = value[0];
    }

    // 先遍历物品 再遍历背包
    for(int i=1; i<size; ++i) {
        for(int j=0; j<=bageweight; ++j) {
            if(j<weight[i]) 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[size-1][bageweight];

}
// 64 位输出请用 printf("%lld")

一维dp数组

滚动数组:更新一行一行;上一层数据进行拷贝

dp[j] :容量为j的背包,所背最大价值为dp[j]

递推公式:dp[j] = max(dp[j], dp[j-weight[i]]+value[i])

初始化:0

遍历顺序:

第一个遍历是物品(先行,一列一列遍历--拷贝)

第二个是背包(倒序)- 避免重复添加

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

int main() {
    int bageweight = 0; // 背包重量
    int size = 0; // 物品数量
    cin >> size >> bageweight;

    vector<int> weight(size, 0);
    vector<int> value(size, 0);
    for(int i=0; i<size; ++i) {
        cin>>weight[i];
        cin>>value[i];
    }

    vector<int> dp(bageweight+1, 0);
    for(int i=0; i<size; ++i) {
        for(int j=bageweight; j>=weight[i]; --j) {
            dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
        }
    }

    cout<<dp[bageweight];

复习:

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

int main() {
    int bageweight = 0; // 背包重量
    int size = 0; // 物品数量
    cin >> size >> bageweight;

    vector<int> weight(size, 0);
    vector<int> value(size, 0);
    for(int i=0; i<size; ++i) {
        cin>>weight[i];
        cin>>value[i];
    }

    // [0, i] 个物品 背包重量为j的情况下所能取到的最大价值
    vector<vector<int>> dp(size, vector(bageweight, 0));
    // 初始化
    // 第一行
    for(int j=weight[0]; j<=bageweight; ++j) {
        dp[0][j] = value[0];
    }
    for(int i=1; i<size; ++i) {
        for(int j=0; j<=bageweight; ++j) {
            if(j<weight[i]) 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[size-1][bageweight];
}
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int bageweight = 0; // 背包重量
    int size = 0; // 物品数量
    cin >> size >> bageweight;

    vector<int> weight(size, 0);
    vector<int> value(size, 0);
    for(int i=0; i<size; ++i) {
        cin>>weight[i];
        cin>>value[i];
    }

    vector<int> dp(bageweight+1, 0);

    for(int i=0; i<size; ++i) {
        for(int j=bageweight; j>=weight[i]; --j) {
            dp[j] = max(dp[j], dp[j-weight[i]]+value[i]);
        }
    }

    cout<<dp[bageweight];
}

416. 分割等和子集

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int sum = 0;
        for(int num:nums) {
            sum += num;
        }
        if(sum%2==1) {
            return false;
        }
        int target = sum/2;

        vector<int> dp(10001, 0);
        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;
    }
};

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

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

相关文章

如何系统性的学习Python语言

零基础同学的福音来了&#xff0c;如果你对Python语言的学习感兴趣&#xff0c;接下来可以由浅入深的了解下Python语言&#xff0c;哪怕你是零基础的小白也完全可以学会的&#xff0c;最后也会给大家放出学习和实例相结合的教程及方法&#xff0c;给到各位同学系统性的教学&…

ES-索引管理

前言 数据类型 ​ 搜索引擎是对数据的检索&#xff0c;所以我们先从生活中的数据说起。我们生活中的数据总体分为两种&#xff1a; 结构化数据非结构化数据 结构化数据&#xff1a; 也称作行数据&#xff0c;是由二维表结构来逻辑表达和实现的数据&#xff0c;严格地遵循数…

<C语言> 数组

1.一维数组的创建和初始化。 1.1 数组的创建 数组是一组相同类型元素的集合。 使用以下方式声明一个一维数组&#xff1a; type arrayName[arraySize];type是数组中元素的类型&#xff0c;arrayName是数组的名称&#xff0c;arraySize是数组的大小&#xff08;即元素的个数&a…

linux系统中如何制作rootfs?详细教程

如何制作rootfs&#xff1f;安排&#xff01;想直奔主题的&#xff0c;直接跳到第四部分。 一、分析 1. 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来&#xff0c;且不需要运行用户进程的话&#xff0c;是不需要文件系统的&#xff0c;文件系统简单的说就是一种…

硬件入门之什么是mos管

硬件入门之什么是mos管 文章目录 硬件入门之什么是mos管一、mos管是什么&#xff1f;MOS管常用于&#xff1a; 驱动大功率电路中。MOS选型参数mos管调参数 二、实际应用场景1.防反接保护电路&#xff09;2.防过压保护电路3.防反接防过压电路一体电路4.驱动电路 总结 一、mos管是…

VS+QT+VTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序

程序示例精选 VSQTVTK三维网格显示-点面选择-法线法向量显示-配准-分割窗体程序 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<VSQTVTK三维网格显示-点面选择-法线法向量显示-配准-分…

Quartz使用H2数据库(嵌入模式)进行持久化

使用H2(嵌入模式)持久化Quartz任务 &#x1f51d;前言&#xff1a; Quartz在包内提供了多种数据库的sql文件&#xff0c;大家可以选择方便的使用。路径如下。 1.初始化h2(不使用Server模式) public class InitH2 {private static String USER_NAME "lee";private…

Unity简单操作:InputSystem获取WASD键盘输入 移动人物

目录 安装InputSystem 在编辑的脚本中使用 InputSystem生成的脚本 Unity版本&#xff1a;2019.2.3f1 安装InputSystem 菜单栏/Window/Package Manager/Input System 工程面板内 右键-->创建Input Actions 选中New Controls改名为PlayerControls 然后属性 面板按下Edit as…

软件项目管理 第七章 软件项目的质量管理与配置管理 课后习题参考答案——主编:李冰、张桥珍、刘玉娥

第七章 软件项目的质量管理与配置管理 课后习题参考答案 1.选择题 (1)项目质量管理的最终责任由谁来承担?&#xff08;D&#xff09; A.项目开发人员 B.采购经理 C.质量经理 D.项目经理 (2)“质量成本”是一个项目管理概念,它说明了下列哪项成本?…

HDFS 写流程源码分析

HDFS 写流程源码分析 一、客户端&#xff08;一&#xff09;文件创建及Pipeline构建阶段&#xff08;二&#xff09;数据写入&#xff08;三&#xff09;输出流关闭 二、NameNode端&#xff08;一&#xff09;create 环境为hadoop 3.1.3 一、客户端 以下代码创建并写入文件。 …

如何优雅地安装 Android Studio

&#x1f4ad; 写在前面&#xff1a;我们假设读者已经搞定 JDK 了&#xff0c;如果没搞定请先搜索 JDK 的安装教程。访问 Oracle JDK 下载页面&#xff1a;访问 Java Downloads | Oracle &#xff0c;点击 "JDK Download" 按钮。选择适合您操作系统的 JDK 版本&#…

设计模式之模板方法模式笔记

设计模式之模板方法模式笔记 说明Template Method(模板方法)目录模板方法模式示例类图抽象类包菜类菜心类测试类 说明 记录下学习设计模式-模板方法模式的写法。JDK使用版本为1.8版本。 Template Method(模板方法) 意图:定义一个操作中的算法骨架&#xff0c;而将一些步骤延…

yolo格式visdrone转换

目录 yolo格式转换1. Visdrone2019格式转换 yolo格式转换 1. Visdrone2019格式转换 数据集下载地址https://aistudio.baidu.com/aistudio/datasetdetail/115729 如果是visdrone数据集&#xff0c;直接使用txt2xml.py去转换&#xff0c;修改annotation和img的路径&#xff0c…

<Linux开发>驱动开发 -之- Linux LCD 驱动

&#xff1c;Linux开发&#xff1e;驱动开发 -之- Linux LCD 驱动 交叉编译环境搭建&#xff1a; &#xff1c;Linux开发&#xff1e; linux开发工具-之-交叉编译环境搭建 uboot移植可参考以下&#xff1a; &#xff1c;Linux开发&#xff1e; -之-系统移植 uboot移植过程详细…

网络基础一

网络发展 独立模式&#xff1a;计算机之间相互独立。 网络互联&#xff1a;多台计算机连接在一起&#xff0c;完成数据共享。 局域网LAN&#xff1a;计算机数量更多了&#xff0c;通过交换机和路由器连接在一起&#xff1b; 广域网WAN&#xff1a;将远隔千里的计算机都连在…

[BPU部署教程] 万字长文!通透解读模型部署端到端大流程——以终为始,以行为知

去年6月份拿到开发板到现在&#xff0c;转眼已经过去大半年了&#xff0c;这个博客11月初就在写&#xff0c;断断续续写到现在。C部署需要考虑的问题很多&#xff0c;如果只给个简单部署教程的话&#xff0c;就算整理出来&#xff0c;感觉帮助也不大&#xff0c;各位开发时候我…

YOLOv5改进系列(11)——添加损失函数之EIoU、AlphaIoU、SIoU、WIoU

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

模版方法模式在 JDK 及 spring 源码中的应用

模版方法模式 模板方法模式是一种行为设计模式&#xff0c; 它在超类中定义了一个算法的框架&#xff0c; 允许子类在不修改结构的情况下重写算法的特定步骤。 更多有关于模版方法模式的介绍详见&#xff1a;https://refactoringguru.cn/design-patterns/template-method 模版…

津津乐道设计模式 - 委派模式详解(以家庭弟位让你彻底明白)

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

STM32 Proteus仿真DHT11温度湿度光敏光强DS1302闹钟-0044

STM32 Proteus仿真DHT11温度湿度光敏光强DS1302闹钟-0044 Proteus仿真小实验&#xff1a; STM32 Proteus仿真DHT11温度湿度光敏光强DS1302闹钟-0044 功能&#xff1a; 硬件组成&#xff1a; STM32F103C6T6单片机 DHT11温度湿度光敏电阻采集光强 多个按键模拟红外遥控1个LED…