代码随想录算法训练营第四十九天(动态规划篇)| 474. 一和零, 完全背包理论基础

本文主要是介绍代码随想录算法训练营第四十九天(动态规划篇)| 474. 一和零, 完全背包理论基础,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

474. 一和零

题目链接:https://leetcode.cn/problems/ones-and-zeroes/submissions/501607337/

思路

之前的背包问题中,我们对背包的限制是容量,即每个背包装的物品的重量和不超过给定容量,这道题的限制是0和1的个数,因此这个背包是二维m和n,最多可以装m个0和n个1。数组中的每个元素都是一个物体,包含若干个0和1。

1. dp数组定义

dp[i][j]: 最多装i个0和j个1的背包最多能装dp[i][j]个物体。

2. 递推公式

遍历每个物体,这个物体有x个0和y个1,我们选择装或者不装这个物体。如果不装它,那么背包中的物体保持原样,如果装它,就要为它腾出相应的0和1的位置,腾出后背包能最多装dp[i-x][j-y]个物体,再加上当前物体,即dp[i-x][j-y]+1,因此递推公式为:

dp[i][j] = max(dp[i][j], dp[i-x][j-y]+1)

3. 初始条件

01背包的dp数组初始化为0就可以。

4. 遍历顺序

外层遍历物体,内层分别遍历背包容量的两个维度,且倒序遍历。在下面的文章中讲过具体细节:代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)-CSDN博客

5. 举例推导dp数组

以输入:["10","0001","111001","1","0"],m = 3,n = 3为例

最后dp数组的状态如下所示:

代码实现

class Solution(object):def findMaxForm(self, strs, m, n):  # m个0,n个1dp = [[0]*(n+1) for _ in range(m+1)]# zeros, ones = 0, 0for s in strs:zeros = s.count('0')ones = s.count('1')for i in range(m, zeros-1, -1):for j in range(n, ones-1, -1):dp[i][j] = max(dp[i][j], dp[i-zeros][j-ones]+1)return dp[m][n]

完全背包理论基础

题目链接:题目页面

思路

完全背包允许物体被重复放入,它的代码与01背包的区别在于遍历顺序。01背包对内部容量的循环是从大到小遍历,为了保证每个物品仅被添加一次。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。

代码实现

N, V = map(int, input().split())
weight, value = [0]*N,[0]*N
for i in range(N):weight[i], value[i] = map(int,input().split())dp = [0]*(V+1)
for i in range(N):for j in range(weight[i], V+1):dp[j] = max(dp[j], dp[j-weight[i]] + value[i])
print(dp[j])

这篇关于代码随想录算法训练营第四十九天(动态规划篇)| 474. 一和零, 完全背包理论基础的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/704209

相关文章

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

Java集合之Iterator迭代器实现代码解析

《Java集合之Iterator迭代器实现代码解析》迭代器Iterator是Java集合框架中的一个核心接口,位于java.util包下,它定义了一种标准的元素访问机制,为各种集合类型提供了一种统一的... 目录一、什么是Iterator二、Iterator的核心方法三、基本使用示例四、Iterator的工

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

全网最全Tomcat完全卸载重装教程小结

《全网最全Tomcat完全卸载重装教程小结》windows系统卸载Tomcat重新通过ZIP方式安装Tomcat,优点是灵活可控,适合开发者自定义配置,手动配置环境变量后,可通过命令行快速启动和管理... 目录一、完全卸载Tomcat1. 停止Tomcat服务2. 通过控制面板卸载3. 手动删除残留文件4.

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Vue实现路由守卫的示例代码

《Vue实现路由守卫的示例代码》Vue路由守卫是控制页面导航的钩子函数,主要用于鉴权、数据预加载等场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、概念二、类型三、实战一、概念路由守卫(Navigation Guards)本质上就是 在路

uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实... 目录方式一:使用<canvas>实现图片压缩(推荐,兼容性好)示例代码(小程序平台):方式二:使用uni