leetcode day37 474

474 一和零

给你一个二进制字符串数组 strs 和两个整数 m 和 n 。

请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。

如果 x 的所有元素也是 y 的元素,集合 x 是集合 y 的 子集 。

示例 1:

输入:strs = ["10", "0001", "111001", "1", "0"], m = 5, n = 3
输出:4
解释:最多有 5 个 0 和 3 个 1 的最大子集是 {"10","0001","1","0"} ,因此答案是 4 。
其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"} 。{"111001"} 不满足题意,因为它含 4 个 1 ,大于 n 的值 3 。
示例 2:

输入:strs = ["10", "0", "1"], m = 1, n = 1
输出:2
解释:最大的子集是 {"0", "1"} ,所以答案是 2 。

01背包问题

1、确定dp数组含义

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

2、初始化为0

3、确定递推公式

因为物品的重量有了两个维度,所以用滚动数组解题,这里用二维数组。

注意:滚动数组双重for循环,必须先遍历物品,再遍历背包,同时背包要倒序遍历。

01背包递推公式dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);

这里转化一下,01的个数相当于weight[i],value就是字符串本身的个数1

int max(int a,int b){return a>b?a:b;
}
int findMaxForm(char** strs, int strsSize, int m, int n) {int dp[m+1][n+1]={};//最多有i个0 j个1的最大子集大小int cnt0,cnt1=0,i,j,k;for(i=0;i<strsSize;i++){char *s=strs[i];int len=strlen(s);cnt0=0,cnt1=0;for(j=0;j<len;j++){if(s[j]=='0')cnt0++;else cnt1++;}for(j=m;j>=cnt0;j--){//先遍历物品,再遍历背包容量for(k=n;k>=cnt1;k--){//倒序遍历,避免被覆盖dp[j][k]=max(dp[j][k],dp[j-cnt0][k-cnt1]+1);}}}return dp[m][n];
}

完全背包

携带研究材料(第七期模拟笔试)

题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。

小明的行李箱所能承担的总重量是有限的,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。

输入描述

第一行包含两个整数,n,v,分别表示研究材料的种类和行李所能承担的总重量 

接下来包含 n 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值

输出描述

输出一个整数,表示最大价值。

输入示例
4 5
1 2
2 4
3 4
4 5
输出示例
10
提示信息

第一种材料选择五次,可以达到最大值。

二维数组会越界,采用一维数组

完全背包与01背包不同点:物品可以重复取多次

1、二维数组情况

(1)dp[i][j]表示[0,i]物品重量为j可重复选的最大价值
 (2)初始化
    dp[0][j]=dp[0][j-w[0]]+v[0]

(3)递推公式
   dp[i][j]=dp[i-1][j];//不放物品i
   dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
  这里是dp[i][j-w[i]]+v[i],与01背包不同,dp[i-1][j-w[i]]+v[i]

2、一维数组

(1)dp[j]表示物品重量为j可重复选的最大价值

 (2)初始化
    dp[j]=dp[j-w[0]]+v[0]

与01背包不同,01背包初始化为01即可

(3)递推公式

dp[j]=max(dp[j],dp[j-w[i]+v[i])

这里与01背包相同

#include<stdio.h>
#define N 10005
#define ll long long
ll max(ll a,ll b){return a>b?a:b;
}
ll w[N]={},v[N]={};
ll dp[N]={};
int main(){int n,m,i,j;scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%lld%lld",&w[i],&v[i]);}//dp[i][j]表示[0,i]物品重量为j可重复选的最大价值for(j=w[0];j<=m;j++){if(j>=w[0])dp[j]=dp[j-w[0]]+v[0];}for(i=1;i<n;i++){for(j=m;j>=w[i];j--){dp[j]=max(dp[j],dp[j-w[i]]+v[i]);}}printf("%lld",dp[m]);return 0;
}

518 零钱兑换

给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。

请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。

假设每一种面额的硬币有无限个。 

题目数据保证结果符合 32 位带符号整数。

    示例 1:

    输入:amount = 5, coins = [1, 2, 5]
    输出:4
    解释:有四种方式可以凑成总金额:
    5=5
    5=2+2+1
    5=2+1+1+1
    5=1+1+1+1+1
    

    示例 2:

    输入:amount = 3, coins = [2]
    输出:0
    解释:只用面额 2 的硬币不能凑成总金额 3 。
    

    示例 3:

    输入:amount = 10, coins = [10]
    输出:1

    因为题目数据保证结果符合 32 位带符号整数。所以要用INT_MAX防止数组越界

    一维数组

    1、dp[j]表示装满j钱的方法数

    2、初始化dp[0]=1

    3、确定动规方程

    二维dp 递推公式: dp[i][j] = dp[i - 1][j] + dp[i][j - coins[i]]

    压缩成一维:dp[j] += dp[j - coins[i]]

    int change(int amount, int* coins, int coinsSize) {int dp[amount + 1];//dp[j]表示凑满j钱的方法memset(dp, 0, sizeof (dp));dp[0] = 1;for(int i = 0; i < coinsSize; i++){for(int j = coins[i]; j <= amount; j++){if (dp[j] < INT_MAX - dp[j - coins[i]])dp[j] += dp[j - coins[i]];//防止相加数据超过int}}return dp[amount];
    }

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

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

    相关文章

    二、信息时代社会结构的转变

    到了信息时代,以及在核武器的前提下,上述的社会结构的逻辑,就有了一个根 本性的转变,就是暴力的成本和收益,都在下降。 暴力的成本在降低。比如说枪支,它的制造和分发都变得非常容易。现在我们都 知道有 3D 打印,它就好像工业时代的印刷机,印刷圣经或者书籍,使知识更加 普及和容…

    Elasticsearch 堆内存使用情况和 JVM 垃圾回收

    作者&#xff1a;来自 Elastic Kofi Bartlett 探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收&#xff0c;包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。 堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。 从 7.11 版本开始&#xff…

    C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载

    前提&#xff1a;如果一个类是空类&#xff0c;C中空类中真的什么都没有吗&#xff0c;不是的&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 默认成员函数&#xff1a;构造函…

    【专题五】位运算(1):常见位运算操作总结

    &#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

    小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案

    一、多网融合解决方案 卫星网络融合‌ 支持接入卫星通信模块&#xff0c;在无地面网络覆盖的极端场景&#xff08;如偏远山区、海洋救援&#xff09;下&#xff0c;形成“5G卫星”双链路冗余传输&#xff0c;卫星链路可作为核心通信备份&#xff0c;确保关键指令和视频数据实…

    【Mybatis】Mybatis基础

    文章目录 前言一、搭建MyBatis1.1 创建maven工程1.2 加入log4j日志功能1.3 MyBatis的增删改查1.4 核心配置文件详解 二、MyBatis获取参数值的两种方式2.1 单个字面量类型的参数2.2 多个字面量类型的参数2.3 map集合类型的参数2.4 实体类类型的参数2.5 使用Param标识参数 三、 M…

    AI四大边界

    大模型训练的边界并非由单一因素决定&#xff0c;而是技术、伦理、法律及实际应用需求共同作用的结果。以下从四个维度解析其边界来源&#xff1a; 一、技术边界&#xff1a;资源与能力的双重限制 计算资源瓶颈 成本与算力&#xff1a;大模型训练依赖海量GPU/TPU资源&#xff…

    Twitter 工作原理|架构解析|社交APP逻辑

    这是对Twitter 工作原理&#xff5c;架构解析&#xff5c;社交APP逻辑_哔哩哔哩_bilibili的学习&#xff0c;感谢up小凡生一 在两年半前&#xff0c;埃隆马斯克收购了Twitter&#xff0c;并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…

    Java基础学习内容大纲

    Java基础学习内容大纲 第一阶段:建立编程思想 ​ Java概述:如何快速学习Java技术、Java历史、Java特点、Sublime、Java运行机制、JDK、转义字符、Java开发规范、Java API ​ 变量:数据类型、变量基本使用、数据类型转换 ​ 运算符:运算符介绍、算数运算符、关系运算符、…

    如何对多维样本进行KS检验

    对于形状为 ( 10000 , 1 , 304 ) (10000, 1, 304) (10000,1,304)的三维数据&#xff0c;若需使用scipy.stats.ks_2samp进行KS检验&#xff0c;可按以下步骤处理&#xff1a; 数据降维 KS检验要求输入为一维数组&#xff0c;需将三维数据展平或按特定维度聚合&#xff1a; • 方…

    在 VMware 虚拟机中安装 Windows7

    文章目录 前言1.安装VMware 虚拟机1. VMware虚拟机软件安装2. 虚拟机创建配置&#xff08;超详细步骤&#xff09;3. Windows7系统安装 3、安装 VMware tools4. VMware Tools安装与优化5. 总结与常见问题 前言 最近有不少朋友在问如何在电脑上同时使用多个操作系统&#xff0c…

    直播预告|TinyVue 组件库高级用法:定制你的企业级UI体系

    TinyVue 是一个跨端跨框架的企业级 UI 组件库&#xff0c;基于 renderless 无渲染组件设计架构&#xff0c;实现了一套代码同时支持 Vue2 和 Vue3&#xff0c;支持 PC 和移动端&#xff0c;包含 100 多个功能丰富的精美组件&#xff0c;可帮助开发者高效开发 Web 应用。 4 月 …

    分治而不割裂—分治协同式敏捷工作模式

    分治而不割裂&#xff1a;解密敏捷协同工作模式如何驱动大企业持续领跑 在数字化浪潮中&#xff0c;亚马逊仅用11天完成Prime Day全球技术架构升级&#xff0c;华为5G基站项目组创造过单周迭代47个功能模块的纪录&#xff0c;这些商业奇迹的背后&#xff0c;都隐藏着一个共性秘…

    Python列表全面解析:从基础到高阶操作

    一、为什么需要列表&#xff1f; 在Python中&#xff0c;列表是可变有序序列&#xff0c;用于存储多个元素的容器。相较于单一变量存储独立值&#xff0c;列表能更高效地管理批量数据&#xff0c;其特点包括&#xff1a; ​引用存储&#xff1a;列表元素存储的是对象的引用​…

    Spring知识点梳理

    一、Spring&#xff08;Spring Framework&#xff09; 1、IOC&#xff08;控制反转&#xff09; 1&#xff09;什么是IOC控制反转&#xff1f; 为了解藕&#xff0c;有反转就有“正转”&#xff0c;“正转”就是程序员手动 new对象&#xff1b;“反转”就是将对象的创建、对…

    SpringBoot启动后自动执行方法的各种方式-笔记

    1. SpringBoot启动后自动执行方法的各种方式 1.1 PostConstruct 注解 作用&#xff1a;在依赖注入完成后执行初始化方法。 适用场景&#xff1a;需要在Bean初始化时执行某些操作&#xff08;如配置、预加载数据&#xff09;。 注意&#xff1a;该方法在Bean初始化阶段执行&…

    基础知识-java流steam

    Java Stream 流详解 一、Stream 概述 #mermaid-svg-ZXmu5UZgAcGGq8EN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-icon{fill:#552222;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-text{fil…

    8.Android(通过Manifest配置文件传递数据(meta-data))

    配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…

    java 解析入参里的cron表达式,修改周时间

    文章目录 前言一、java 解析入参里的cron表达式,修改周时间二、使用步骤1.示例 总结 前言 一、java 解析入参里的cron表达式,修改周时间 示例&#xff1a; 第一种: 0 0 0,16 ? * 0,1 第2种 0 0 0,16 ? * 1-7 第3种 0 0 0,16 ? * ? 第4种 0 0 0,16 ? * * 二、使用步骤 1…

    DTO,VO,PO,Entity

    1. DTO (Data Transfer Object) 定义 DTO 是数据传输对象&#xff0c;用于在不同系统或层之间传输数据。 目的 简化数据传输&#xff0c;降低耦合&#xff0c;通常只包含需要传输的字段&#xff0c;避免暴露内部实现细节。 使用场景 Controller 和 Service 或 远程调用 之…