力扣11.3

1981. 最小化目标值与所选元素的差

给你一个大小为 m x n 的整数矩阵 mat 和一个整数 target

从矩阵的 每一行 中选择一个整数,你的目标是 最小化 所有选中元素之 和 与目标值 target 的 绝对差 。

返回 最小的绝对差 。

ab 两数字的 绝对差 是 a - b 的绝对值。

数据范围

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 70
  • 1 <= mat[i][j] <= 70
  • 1 <= target <= 800

分析

分组背包,将被一行的元素看作一组,每次只能选一行中的一个元素,朴素dp做法是令 d p [ i ] [ j ] dp[i][j] dp[i][j]为选择前i行,元素之和为j的方案是否存在
状态转移为:

  • d p [ i ] [ j ] ∣ = d p [ i − 1 ] [ j − c ] dp[i][j] \ |= \ dp[i-1][j-c] dp[i][j] = dp[i1][jc],(c为每一行对应的元素)

最后的答案只需要遍历dp[n][i]即可

代码

class Solution {
public:const static int N = 72;bool dp[N][5000];int minimizeTheDifference(vector<vector<int>>& mat, int target) {int n = mat.size(), m = mat[0].size();memset(dp, false, sizeof(dp));dp[0][0] = true;for(int i = 0; i < n; i ++ ) {for(int j = 0; j < 5000; j ++ ) {for(int k = 0; k < m; k ++ ) {int c = mat[i][k];if(j >= c) {if(dp[i][j - c]) dp[i + 1][j] = true;}}}}int res = 0x3f3f3f3f;for(int i = 0; i < 5000; i ++ ) {if(dp[n][i]) {if(abs(target - i) < abs(res - target)) {res = i;}}}return abs(target - res);}
};

优化

可以使用bitset进行优化,bitset优化的原理是:
将dp数组转换成一个二进制数,若二进制数的第i位为1,则说明体积为j的方案存在
在滚动数组的过程中,我们以c=3为例

  • d p [ 3 ] ∣ = d p [ 0 ] dp[3] \ |= \ dp[0] dp[3] = dp[0]
  • d p [ 4 ] ∣ = d p [ 1 ] dp[4] \ |= \ dp[1] dp[4] = dp[1]
  • d p [ 5 ] ∣ = d p [ 2 ] dp[5] \ |= \ dp[2] dp[5] = dp[2]

若转换成二进制数k,则是将低M-c位左移c位在或回去,即:

  • f ∣ = f < < c f \ |= f << c f =f<<c

需要注意的是,每一行都必须选元素,因此只能使用上一轮的状态,需要两个dp合并使用,否则会受之前状态的影响

代码

class Solution {
public:const static int N = 72, M = 5000;int minimizeTheDifference(vector<vector<int>>& mat, int target) {int n = mat.size(), m = mat[0].size();bitset<M> f1{1}, f2;for(int i = 0; i < n; i ++ ) {for(int k = 0; k < m; k ++ ) {int c = mat[i][k];f2 |= f1 << c;}f1 = f2;f2.reset();}int res = 0x3f3f3f3f;for(int i = 0; i < 5000; i ++ ) {if(f1.test(i)) {if(abs(target - i) < abs(res - target)) {res = i;}}}return abs(target - res);}
};

1155. 掷骰子等于目标和的方法数

这里有 n 个一样的骰子,每个骰子上都有 k 个面,分别标号为 1k

给定三个整数 nktarget,请返回投掷骰子的所有可能得到的结果(共有 k^n 种方式),使得骰子面朝上的数字总和等于 target

由于答案可能很大,你需要对 109 + 7 取模。

数据范围

  • 1 <= n, k <= 30
  • 1 <= target <= 1000

分析

简单背包,注意每个骰子都必须使用

代码

typedef long long LL;
class Solution {
public:const static int N = 35, M = 1005, mod = 1e9 + 7;LL dp[N][M];LL numRollsToTarget(int n, int k, int target) {dp[0][0] = 1;for(int i = 1; i <= n; i ++ ) {for(int j = 0; j <= target; j ++ ) {for(int z = 1; z <= k; z ++ ) {if(j >= z) {dp[i][j] += dp[i - 1][j - z] % mod;dp[i][j] %= mod;}}}}return dp[n][target];}
};

2585. 获得分数的方法数

考试中有 n 种类型的题目。给你一个整数 target 和一个下标从 0 开始的二维整数数组 types ,其中 types[i] = [counti, marksi] 表示第 i 种类型的题目有 counti 道,每道题目对应 marksi 分。

返回你在考试中恰好得到 target 分的方法数。由于答案可能很大,结果需要对 109 +7 取余。

注意,同类型题目无法区分。

比如说,如果有 3 道同类型题目,那么解答第 1 和第 2 道题目与解答第 1 和第 3 道题目或者第 2 和第 3 道题目是相同的。

数据范围

  • 1 <= target <= 1000
  • n == types.length
  • 1 <= n <= 50
  • types[i].length == 2
  • 1 <= counti, marksi <= 50

分析

多重背包

代码

typedef long long LL;
class Solution {
public:const static int N = 55, M = 1005, mod = 1e9 + 7;LL dp[M];int waysToReachTarget(int target, vector<vector<int>>& types) {int n = types.size();dp[0] = 1;for(int i = 0; i < n; i ++ ) {int a = types[i][0], b = types[i][1];for(int j = target; j >= 0; j -- ) {for(int k = 1; k <= a; k ++ ) {if(j >= k * b) {dp[j] += dp[j - k * b];dp[j] %= mod;}}}}return dp[target];}
};

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

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

相关文章

宝塔使用clickhouse踩坑

前言 最近有个物联网项目&#xff0c;需要存储物联网终端发送过来的信息&#xff08;类似log日志&#xff0c;但又要存储在数据库里&#xff0c;方便后期聚合统计&#xff09;&#xff0c;本来想写文件的奈何客户要求聚合统计&#xff0c;所以只能用数据库才能达到更高的计算效…

parted 磁盘分区

目录 磁盘格式磁盘分区文件系统挂载使用扩展 - parted、fdisk、gdisk 区别 磁盘格式 parted /dev/vdcmklabel gpt # 设置磁盘格式为GPT p # 打印磁盘信息此时磁盘格式设置完成&#xff01; 磁盘分区 开始分区&#xff1a; mkpart data_mysql # 分区名&…

NFTScan Site:以蓝标认证与高级项目管理功能赋能 NFT 项目

自 NFTScan Site 上线以来&#xff0c;它迅速成为 NFT 市场中的一支重要力量&#xff0c;凭借对各类 NFT 集合、市场以及 NFTfi 项目的认证获得了广泛认可。这个平台帮助许多项目提升了曝光度和可见性&#xff0c;为它们在竞争激烈的 NFT 市场中创造了更大的成功机会。 在最新更…

统计数据集的TXT、XML及JSON标注文件中各类别/每个标签的数量

在计算机视觉和深度学习领域&#xff0c;标注文件是模型训练的重要组成部分。无论是图像分类、目标检测还是图像分割&#xff0c;正确的标注能够显著提升模型的性能。在实际应用中&#xff0c;我们需要快速了解每个类别的样本数量&#xff0c;以便进行数据分析、平衡类别分布或…

leetcode-5-最长回文子串

题解&#xff1a; 回文串&#xff1a;如果一个字符串正着读和反着读都是一样的那这个字符串就是回文串。 对于一个子串而言&#xff0c;如果它是回文串&#xff0c;并且长度大于 2&#xff0c;那么将它首尾的两个字母去除之后&#xff0c;它仍然是个回文串。 1、初始化字典d…

深入了解 Flutter 中的泛型:让代码更灵活更安全的关键

目录 前言 一、泛型类 二、泛型方法 三、泛型约束 四、Flutter 中泛型的实际应用 前言 泛型&#xff08;Generics&#xff09;是编程语言中一种关键机制&#xff0c;它允许我们在类、接口、方法等结构中使用类型参数&#xff0c;而不必指定具体的类型。在 Flutter 中&…

移动混合开发面试题及参考答案

目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…

mysql5安装

1.下载安装包 https://downloads.mysql.com/archives/community/ mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar tar -xvf mysql-5.7.44-1.el7.x86_64.rpm-bundle.tar2.安装依赖 yum -y install perl yum -y install net-tools yum install numactl libaio libaio-devel -y也可…

【工具变量】“宽带中国”试点城市名单匹配数据集(2000-2023年)

参照秦文晋&#xff08;2022&#xff09;的《网络基础设施建设对数字经济发展的影响研究——基于"宽带中国"试点政策的准自然实验》一文中的做法&#xff0c;将选为“宽带中国”试点城市的虚拟变量作为核心解释变量&#xff0c;当一个城市被批复成为“宽带中国”试点…

php内置服务停止shell小工具,用来停止指定的端口的php内置服务进程

最近vscode总是喜欢闪退&#xff0c;这导致了上面启动的php内置服务变成了无法管理状态&#xff0c;所以就有了这个工具来停止相关的PHP内置服务进程. 将下面的代码保存到本地合适的位置&#xff0c;并命名为 stop.sh #!/bin/bash # Author: tekintian # Date: 2024-11-02 …

Servlet 3.0 注解开发

文章目录 Servlet3.0注解开发修改idea创建注解的servlet模板内容讲解 关于servlet3.0注解开发的疑问_配置路径省略了属性urlPatterns内容讲解内容小结 Servlet3.0注解开发 【1】问题 说明&#xff1a;之前我们都是使用web.xml进行servlet映射路径的配置。这样配置的弊端&…

力扣每日一题——数组能够形成多少对

目录 题目链接&#xff1a;2341. 数组能形成多少数对 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;List集合 Java写法&#xff1a; 运行时间 C写法&#xff1a; 解法二&#xff1a;Set集合 Java写法&#xff1a; 运行时间 C写法 上述两种方法…

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…

高级java每日一道面试题-2024年10月27日-Redis篇-jedis和redisson有哪些区别?

如果有遗漏,评论区告诉我进行补充 面试官: jedis和redisson有哪些区别? 我回答: 在Java高级面试中&#xff0c;Jedis和Redisson的区别是一个常见且重要的话题。以下是对这两个Java客户端库的详细对比&#xff1a; 设计思想与实现方式 Jedis&#xff1a; 设计思想&#xff…

[Python]K小姐经营着一家蛋糕店,她的蛋糕店有 n 种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。

问题来源&#xff1a;【秋招突围】2024届秋招-京东笔试题-第三套_牛客网 问题描述 K小姐经营着一家蛋糕店&#xff0c;她的蛋糕店有 n种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。 对于每种口味的蛋糕&#xff0c;如果 A 工厂生产的口感值为 AiA_iAi​&…

设计模式讲解01-建造者模式(Builder)

1. 概述 建造者模式也称为&#xff1a;生成器模式 定义&#xff1a;建造者模式是一种创建型设计模式&#xff0c;它允许你将创建复杂对象的步骤与表示方式相分离。 解释&#xff1a;建造者模式就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单…

【Python ASR 】模型对比 whisper 和 funasr

【Python ASR 】模型对比 模型差异比较大的几段结果最后相关网站 模型 Paraformer-zh&#xff08;离线免费-推荐&#xff09; 语音识别&#xff0c;带时间戳输出&#xff0c;非实时 SenseVoiceSmall&#xff08;离线免费&#xff09; 多种语音理解能力&#xff0c;涵盖了自动语…

Python爬虫抓取三个网站上的英语每日一句

一、引言 大学英语学习需要巩固高中语法&#xff0c;补充四六级词汇&#xff0c;增加英语语感&#xff0c;提升英语的运用能力。学好英语有很多种方法&#xff0c;采用句子来突破英语语法、词汇、口语和听力的方法简单有效&#xff0c;值得提倡。李阳就是采用这种方法来教授英…

PostgreSQL 学习笔记:PostgreSQL 主从复制

PostgreSQL 笔记&#xff1a;PostgreSQL 主从复制 博客地址&#xff1a;TMDOG 的博客 在现代应用程序中&#xff0c;数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能&#xff0c;可以在多个数据库实例之间复制数据&#xff0c;以实现冗余和负载均衡。本…

[云讷科技]DASA数字孪生机器人概念

DASA数字孪生机器人概念 我们在 虚幻引擎 (UE) 的帮助下在 DASA 中建立了数字孪生机器人概念。 UE 是 Epic Games 开发的 3D 计算机图形游戏引擎&#xff0c;广泛应用于视频游戏、电影和电视。我们在 DASA 中利用强大的 UE 功能来实现外观逼真的数字机器人&#xff0c;并允许与…