【代码随想录】【算法训练营】【第41天】 [416]分割等和子集

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 40,休息,休息一下~
day 41,艰难的周一~

题目详情

[416] 分割等和子集

题目描述

416 分割等和子集
416 分割等和子集

解题思路

前提:是否可以将数组分为和相等的两个子集,每个元素只能使用一次
思路:动态规划,0-1背包问题
重点:0-1背包问题的二维数组dp[i][j]的含义与实现;一维数组dp[j]的实现,尤其是遍历顺序的区别。

代码实现

C语言
二维数组dp[i][j]
// 0-1背包问题, 二维数组dp[i][j]: 从下标[0, i]中选取元素,限制在大小为j中的最大元素和
// dp[i][j] = max((dp[i-1][j-nums[i]] + nums[i]), dp[i-1][j])
int sumFun(int *nums, int numsSize)
{
    int sumTmp = 0;
    for (int i = 0; i < numsSize; i++) {
        sumTmp += nums[i];
    }
    return sumTmp;
}

int maxFun(int p1, int p2)
{
    return p1 > p2 ? p1 : p2;
}

bool canPartition(int* nums, int numsSize) {
    int sum = sumFun(nums, numsSize);
    if (sum % 2 == 1) {
        return false;
    }
    int target = sum / 2;
    int dp[numsSize][target + 1];
    // 初始化dp数组
    for (int j = 0; j <= target; j++) {
        if (j < nums[0]) {
            dp[0][j] = 0;
        } else {
            dp[0][j] = nums[0];
        }
    }
    // 从前向后遍历
    for (int i = 1; i < numsSize; i++) {
        for (int j = 0; j <= target; j++) {
            if (j < nums[i]) {
                dp[i][j] = dp[i - 1][j];
            } else {
                dp[i][j] = maxFun((dp[i - 1][j - nums[i]] + nums[i]), dp[i - 1][j]);
            }
        }
    }
    if (dp[numsSize - 1][target] == target) {
        return true;
    }
    return false;
}
一维数组dp[j]

由于每个元素只能使用一次,所以对于内层遍历的元素和,需要从大到小遍历,即dp[j]的赋值不会引起dp[j-1]的数值变化,即从小到大遍历,会使元素i使用多次。

// 0-1背包问题, 一维数组dp[j]: 从下标[0, i]中选取元素,限制在大小为j中的最大元素和
// dp[j] = max((dp[j-nums[i]] + nums[i]), dp[j])
int sumFun(int *nums, int numsSize)
{
    int sumTmp = 0;
    for (int i = 0; i < numsSize; i++) {
        sumTmp += nums[i];
    }
    return sumTmp;
}

int maxFun(int p1, int p2)
{
    return p1 > p2 ? p1 : p2;
}

bool canPartition(int* nums, int numsSize) {
    int sum = sumFun(nums, numsSize);
    if (sum % 2 == 1) {
        return false;
    }
    int target = sum / 2;
    int dp[target + 1];
    // 初始化dp数组
    for (int i = 0; i < target + 1; i++) {
        dp[i] = 0;
    }
    // 从前向后遍历元素,从后向前遍历元素和
    for (int i = 0; i < numsSize; i++) {
        for (int j = target; j >= nums[i]; j--) {
            dp[j] = maxFun((dp[j - nums[i]] + nums[i]), dp[j]);
        }
    }
    if (dp[target] == target) {
        return true;
    }
    return false;
}

今日收获

  1. 0-1背包问题:dp数组的含义、初始化、递推公式;dp数组的二维实现、一维实现;物品、背包容积的先后遍历顺序、以及每个维度的大小遍历顺序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

android中的JNI的DEMO

一&#xff1a;源代码 native-lib.cpp #include "native-lib.h"JNIEXPORT jint JNICALL Java_com_example_jnidemo_MainActivity_add(JNIEnv* env, jobject, jint a, jint b) {return a b; }JNIEXPORT jint JNICALL Java_com_example_jnidemo_MainActivity_subtra…

DBeaver连接数据库

1、空白处右键点击 2、创建-连接 3、选择不同的数据库 4、修改信息 (mac)双击&#xff0c;连接&#xff0c;根据自己的需求重命名

VBA学习(2):Excel VBA初学者编写第一个宏

要在Excel中编写宏程序&#xff0c;首先需要了解VBA语言&#xff0c;而快速入门的技巧就是使用宏录制器。 宏录制器就像一台录音机&#xff0c;可以使用VBA监听和记录你在Excel中所做的一切操作。对于初学者来说&#xff0c;你可能不了解VBA&#xff0c;这里&#xff0c;我们会…

抖音用户新作品监控助手,第一时间获取博主作品信息。

声明&#xff1a; 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。包含关注&#xff0c;点赞等 抖音新作品监控助手系统是一个功能强大的…

ChatGPT-4o赋能科研:自然科学研究的新篇章

自然科学研究遵循严谨的科学方法论&#xff0c;包括文献调研、问题综述、试验设计、提出假设、数据清洗、统计诊断、大数据分析、经典统计模型&#xff08;回归模型、混合效应模型、结构方程模型、Meta分析模型&#xff09;、参数优化、机器/深度学习、大尺度模型构建与模拟、论…

持PMP证书可以免考申请CSPM-2国标证书!

一提到项目管理的专业认证&#xff0c;大家首先想到的肯定是以PMP为核心的PMI体系认证。当然也有BSI和IPMP等其他体系认证&#xff0c;但都是从国外引进的专业认证&#xff0c;我国始终缺少符合中国特色项目管理环境下的项目管理专业认证体系。 如今&#xff0c;更符合中国国情…

单细胞|RNA-seq ATAC-seq 联合分析

引言 本文[1]将介绍如何利用Signac和Seurat这两个工具&#xff0c;对一个同时记录了DNA可接触性和基因表达的单细胞数据集进行综合分析。我们将以一个公开的10x Genomics Multiome数据集为例&#xff0c;该数据集针对的是人体的外周血单核细胞。 数据准备 library(Signac)libra…

八股文之JVM

目录 1.JVM内存划分 2.JVM类加载过程 3.JVM垃圾回收机制GC 3.1.判断谁是垃圾 3.2.如何释放对应的内存 1.JVM内存划分 在一个Java程序运行起来之后&#xff0c;jvm就会从操作系统中申请一块内存&#xff0c;然后就会将该内存划分成多个部分&#xff0c;用于不同的用途。 …

【拥抱鸿蒙】HarmonyOS NEXT实现双路预览并识别文字

我们在许多其他平台看到过OCR功能的应用&#xff0c;那么HarmonyOS在这方面的支持如何呢&#xff1f;我们如何能快速使用这一能力呢&#xff1f;使用这一能力需要注意的点有哪些呢&#xff1f;就让我们一起来探究吧~ 【开发环境】 版本规则号&#xff1a;HarmonyOS NEXT版本类…

闭包表(Closure Table)

设计血缘关系&#xff08;data-lineage&#xff09;时&#xff0c;想到要使用的表模型。 表设计 节点记录表 - node CREATE TABLE lineages_node (name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 节点名称,id bigint(20) unsigned NOT NULL AUTO_INCREM…

python图像处理库-PIL(Pillow)

PIL库全称为Python Imaging Library&#xff0c;即Python图像处理库&#xff0c;是一个在Python中用于处理图像的非常流行的库。 一、PIL介绍 这个库提供了广泛的文件格式支持、高效的内部表示以及相当强大的图像处理功能。 核心图像库旨在快速访问存储在几种基本像素格式中的数…

C#特性-CallerMemberName、CallerFilePath和CallerLineNumber的介绍和应用

介绍 在csharp中&#xff0c;CallerMemberName, CallerFilePath, 和 CallerLineNumber 是编译时常量&#xff0c;它们是csharp 5.0引入的特性&#xff0c;用于提供有关调用堆栈的信息&#xff0c;通常用于日志记录和调试。这些特性可以自动填充方法的参数&#xff0c;无需显式…

基于SpringBoot校园食堂订餐管理系统

文章目录 系统运行图概要整体架构流程技术名词解释 系统运行图 概要 随着校园人口的增加和生活节奏的加快&#xff0c;校园食堂的订餐管理面临着诸多挑战&#xff0c;传统的人工点餐方式已经不能满足日益增长的需求和期望。因此&#xff0c;本论文旨在设计和实现一种基于Java的…

图解Attention学习笔记

教程是来自https://github.com/datawhalechina/learn-nlp-with-transformers/blob/main/docs/ 图解Attention Attention出现的原因是&#xff1a;基于循环神经网络&#xff08;RNN&#xff09;一类的seq2seq模型&#xff0c;在处理长文本时遇到了挑战&#xff0c;而对长文本中…

IPD体系进阶:组织体系诊断7S模型

目录 1. IPD 变革说明 2. 麦肯锡 7S 模型 3. IPD 资源 1. IPD 变革说明 企业引入 IPD&#xff0c;最直接的原因在于&#xff1a; 要解决组织当下遇到的发展问题。 这个时候就离不开对自身的诊断。 这跟解决日常问题是一样的思路。 有这样一句爱因斯坦的名言&#xff0c…

垃圾回收管理系统设计

一、引言 随着城市化进程的加快&#xff0c;垃圾处理问题日益凸显。为了有效管理垃圾回收&#xff0c;提高资源利用效率&#xff0c;降低环境污染&#xff0c;本文设计了一套垃圾回收管理系统。该系统涵盖了数据收集与分析、智能监测与识别、资源调配与协调、用户参与与反馈、…

maven编译【-Dmaven.test.skip=true和-DskipTests=true的区别】

1、背景 我在执行maven编译时&#xff0c;遇到下面情况&#xff1a; 1、当执行命令为下面&#xff1a; mvn clean compile package install -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue -Dra…

基于自编码器的心电图信号异常检测(Python)

使用的数据集来自PTB心电图数据库&#xff0c;包括14552个心电图记录&#xff0c;包括两类&#xff1a;正常心跳和异常心跳&#xff0c;采样频率为125Hz。 import numpy as np np.set_printoptions(suppressTrue) import pandas as pd import matplotlib.pyplot as plt import…

qss实现登录界面美化

qss实现登录界面美化 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 去掉头部this->setWindowFlag(Qt::FramelessWindowHint);// 去掉空白部分th…

批量修改文件后缀名

背景引言 bat 文件是dos下的批处理文件。批处理文件是无格式的文本文件&#xff0c;它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下输入批处理文件的名称&#xff0c;或者双击该批处理文件&#xff0c;系统就会调用cmd.exe按照该文件中各个命令出现的顺序…