代码随想录训练营第36天|二维背包

news2024/11/15 8:19:06

1049. 最后一块石头的重量 II

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum=accumulate(stones.begin(),stones.end(),0);
        int target=sum/2;
        vector<int> dp(target+1,0);
        for(auto& stone: stones){
            for(int i=target; i>=stone; i--){
                dp[i]=max(dp[i],dp[i-stone]+stone);
            }
        }
        return sum-2*dp[target];
    }
};

dp[i]:容量为i的背包所能装载的最大价值(重量)

转移方程:尝试所有可能得石头,它占据空间stone,同时带来价值stone,累计最大。

注意细节:target是向下取整得到,所以是较小的那部分,剩余的部分做被减数。

494. 目标和

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        int sum=accumulate(nums.begin(),nums.end(),0);
        if((sum-target)%2==1)
            return 0;
        if(target>sum)
            return 0;
        int negative=(sum-target)/2;
        vector<int> dp(negative+1,0);
        dp[0]=1;
        for(auto& num: nums){
            for(int i=negative; i>=num; i--){
                dp[i]+=dp[i-num];
            }
        }
        return dp[negative];
    }
};

假定选择一部分元素形成negative集合,在其之前添加负号满足要求,那么有:

(sum-negative)-negative=target

从而可得:negative=(sum-target)/2

题目转化为,求解和为negative的子集方案数,利用动态规划求解:

dp[i]:和为i的子集方案数

初始化dp[0]=1,表示和为0的方案数为1,即空集:一个都不选也是一种方案。

转移方程:dp[i]+=dp[i-num];

表示dp[i]可由任一个num转移而来,则要求转移前的和为i-num,对应的方案数dp[i-num],累加所有的可能得到总的方案数。

474. 一和零

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> dp(m+1,vector<int>(n+1,0));
        for(auto& str: strs){
            int zero_num=0, one_num=0;
            for(auto&c :str){
                if(c=='0')
                    zero_num++;
                else
                    one_num++;
            }
            for(int i=m; i>=zero_num; i--){
                for(int j=n; j>=one_num; j--){
                    dp[i][j]=max(dp[i][j],dp[i-zero_num][j-one_num]+1);
                }
            }
        }
        return dp[m][n];
    }
};

dp[i][j]:0最大i个,1最大j个的最大子集中的元素数目。

转移方程:尝试用所有str刷新“滚动数组”,先统计该str的01分布,使用该str,则dp[i][j]将由dp[i-zero_num][j-one_num]转移而来,累计最大值。

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

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

相关文章

如何快速学习拼音打字?

拼音打字是很多人学会使用电脑或手机的第一步&#xff0c;尤其是对于需要经常输入中文的人来说&#xff0c;熟练掌握拼音打字可以大大提升效率。下面分享一些快速学习拼音打字的方法和技巧&#xff0c;帮助你尽快掌握这项技能。 1. 了解拼音的基本规则 学习拼音打字之前&…

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一&#xff1a; 拓扑排序 软件构建 题目链接&#xff1a;卡码网&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文…

Vue|mixin混入

目录 mixin混入什么是mixin代码准备如何混入?全局混合 在 Vue 中&#xff0c;混入&#xff08;Mixins&#xff09;是一种灵活的分发功能&#xff0c;可以将可复用的代码片段和功能注入到多个组件中。简单来说&#xff0c;混入允许你在多个组件之间共享逻辑&#xff0c;而无需重…

QT<24> Qt和windows中获取CPU序列号号以及主板序列号

前言&#xff1a;在qt中获取CPU和主板唯一序列号&#xff0c;可以在程序构造函数中判断是否与windows中一致&#xff0c;不一致可以直接退出程序&#xff0c;防止程序daoyong。 一、获取电脑CPU唯一序列号 QString MainPage::get_cpu() {QString cmd"wmic cpu get proc…

DNS和ICMP

DNS DNS&#xff08;Domain Name System &#xff09; DNS 是一整套从域名映射到 IP 的系统 关于DNS背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 . 但是 IP 地址不 方便记忆 . 于是人们发明了一种叫主机名的东西 , 是一个字符串 , 并且…

computed计算属性与watch侦听器

1.computed计算属性的写法有两种&#xff0c;一种是只读的&#xff0c;只负责展示&#xff0c;另一种可以进行修改&#xff0c;利用get来获取值&#xff0c;利用set来进行修改 2.watch侦听器的写法也有两种&#xff0c;可以直接写成函数&#xff0c;也可以写成对象&#xff0c;…

浅显易懂的Git教程

Git概述 SVN与Git的对比 SVN&#xff08;Subversion&#xff09; 类型&#xff1a;集中式版本控制系统 工作流程&#xff1a; 从中央服务器下载最新版本到本地。在本地进行开发。提交更改回中央服务器。 优点&#xff1a; 简单易用&#xff0c;适合小型团队。版本历史清…

【源代码+仿真+原理图+技术文档+演示视频+软件】基于物联网的多功能手环设计与实现

摘 要 随着社会进步和生活水平的提高&#xff0c;人们对健康的重视程度不断增加。为了更好地了解自身的身心健康状况&#xff0c;人们对高精密、便携式医疗监控仪器的需求也越来越大。电子信息技术和医学的发展相互促进&#xff0c;二者的结合可以解决人们在健康问题上的困扰…

单通道低压全桥驱动芯片既可应用在电子锁,医疗器械等产品中也能直接Pin to pin贝岭的BL8123

芯片描述 GC8123 是一款低压 5V 全桥驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。GC8123 能提供高达 1.2A 的持续输出电流。可以工作在 1.2~6V 的电源电压上。GC8123 具有 PWM&#xff08;IN/IN&…

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

Linux配置静态IP详细步骤及联网问题,以及更改主机名问题

一&#xff0c;Linux配置静态IP详细步骤及联网问题 我的Linux操作系统版本是是CentOS7/CentOS8 1.网络适配器&#xff1a;NAT模式点击设置-网络适配器-网络连接 &#xff08;选择NAT模式&#xff09;-点击确定 2.查看网关相关配置点击 编辑-虚拟网络编辑器-选择VMnet8-点击更…

python 环境问题

日常环境问题记录 1、pycharm 终端禁止运行脚本1.1 问题描述1.2 以管理员身份运行powershell1.3 修改权限 1、pycharm 终端禁止运行脚本 1.1 问题描述 当我在pycharm终端执行脚本&#xff0c;比如 activate激活虚拟环境时&#xff0c;会报错不让执行 这类问题的出现原因是没…

操作系统相关

操作系统 1. 操作系统主要功能 进程管理 功能&#xff1a;创建、调度、终止进程&#xff0c;管理进程的执行。目的&#xff1a;确保多个进程能够有效地共享处理器资源&#xff0c;并进行合理的调度和管理。 内存管理 功能&#xff1a;分配和管理系统内存&#xff0c;包括虚拟…

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…

系统编程-初识MCU

初识MCU 目录 初识MCU 一、什么是mcu&#xff1f; 二、MCU 的组成与作用 三、常见的MCU 四、家用空气质量检测仪项目分析 1、项目市场调研 2、项目需求分析&#xff08;重要&#xff09; 3、产品的硬件设计 五、常用元器件以及对应电路介绍(重点) 1、电阻 2、电容 …

怎么使用Chrome与C++实现高效自动化测试

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键步骤。谷歌浏览器&#xff08;Chrome&#xff09;提供了强大的开发者工具和丰富的API&#xff0c;结合C的强大功能&#xff0c;可以实现高效的自动化测试。本文将介绍如何使用Chrome和C来实现这一目标。&am…

路径规划算法-蚁群算法

一、蚁群算法&#xff08;ACO&#xff09;基本原理 winter老哥链接 蚁群路径规划算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式优化算法&#xff0c;它通过模拟蚂蚁在寻找食物过程中的路径选择和信息素交流来解决路径规划问题。以下…

图片文字翻译怎么快速翻译?5个软件教你快速进行图片文字翻译

图片文字翻译怎么快速翻译&#xff1f;5个软件教你快速进行图片文字翻译 图片文字翻译是日常工作和生活中常见的需求&#xff0c;尤其是在处理外文资料或旅游时。以下5款优秀的软件可以帮助你轻松、快速地将图片中的文字进行翻译&#xff0c;让你不再依赖手动输入和繁琐操作。…

linux概述与安装虚拟机

linux 1.Linux 概述 Linux 是一个极具影响力和广泛应用的操作系统。 它起源于芬兰人林纳斯・托瓦兹在大学期间编写的开源内核。Linux 作为一个整体&#xff0c;是免费供用户使用的&#xff0c;具备多用户、多任务、支持多线程的强大特性。 Linux 内核是其核心部分&#xff…

JAVA基础:线程优先级和精灵线程

目录 前言 线程优先级 精灵线程 前言 线程存在的目的是为了提升代码的效率&#xff0c;以前的程序只有主线程自己执行是串行的&#xff0c;这样的代码效率低 &#xff0c;多线程执行的代码是并行的&#xff0c;多个线程同时执行代码&#xff0c;这样的效率高&#xff0c;但是…