牛客题解 | 分割等和子集

news/2025/2/21 17:53:05/文章来源:https://www.cnblogs.com/wc529065/p/18729731

题目

题目链接

解题思路

这是一个01背包问题的变体:

  1. 问题分析:

    • 目标:找到一些数,使其和等于剩余数之和
    • 等价于:找到一些数,使其和等于总和的一半
    • 因为:如果一部分和为 \(sum/2\),那么剩余部分也为 \(sum/2\)
  2. 解题步骤:

    • 先求出数组总和 \(sum\)
    • 如果 \(sum\) 是奇数,直接返回 false
    • 问题转化为:能否从数组中选择一些数,使其和为 \(sum/2\)
    • 使用01背包求解
  3. 动态规划设计:

    • 状态定义:\(dp[j]\) 表示是否能凑出和为 \(j\)
    • 初始化:\(dp[0]=true\),其他为 \(false\)
    • 状态转移:\(dp[j] = dp[j] || dp[j-num]\)

代码

#include <iostream>
#include <vector>
#include <numeric>
using namespace std;bool canPartition(vector<int>& nums) {int sum = accumulate(nums.begin(), nums.end(), 0);// 如果总和为奇数,无法平分if(sum % 2 != 0) return false;int target = sum / 2;vector<bool> dp(target + 1, false);dp[0] = true;// 对每个数进行01背包for(int num : nums) {// 从后向前遍历for(int j = target; j >= num; j--) {dp[j] = dp[j] || dp[j - num];}}return dp[target];
}int main() {int n;cin >> n;vector<int> nums(n);for(int i = 0; i < n; i++) {cin >> nums[i];}cout << (canPartition(nums) ? "true" : "false") << endl;return 0;
}
import java.util.*;public class Main {public static boolean canPartition(int[] nums) {int sum = 0;for(int num : nums) sum += num;// 如果总和为奇数,无法平分if(sum % 2 != 0) return false;int target = sum / 2;boolean[] dp = new boolean[target + 1];dp[0] = true;// 对每个数进行01背包for(int num : nums) {// 从后向前遍历for(int j = target; j >= num; j--) {dp[j] = dp[j] || dp[j - num];}}return dp[target];}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] nums = new int[n];for(int i = 0; i < n; i++) {nums[i] = sc.nextInt();}System.out.println(canPartition(nums) ? "true" : "false");sc.close();}
}
def can_partition(nums: list) -> bool:total = sum(nums)# 如果总和为奇数,无法平分if total % 2 != 0:return Falsetarget = total // 2dp = [False] * (target + 1)dp[0] = True# 对每个数进行01背包for num in nums:# 从后向前遍历for j in range(target, num - 1, -1):dp[j] = dp[j] or dp[j - num]return dp[target]if __name__ == "__main__":n = int(input())nums = list(map(int, input().split()))print("true" if can_partition(nums) else "false")

算法及复杂度

  • 算法:动态规划(01背包)
  • 时间复杂度:\(\mathcal{O}(n \times target)\),其中 \(n\) 是数组长度,\(target\) 是总和的一半
  • 空间复杂度:\(\mathcal{O}(target)\),使用一维 \(dp\) 数组

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

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

相关文章

LLM高效推理:KV缓存与分页注意力机制深度解析

随着大型语言模型(LLM)规模和复杂性的持续增长,高效推理的重要性日益凸显。KV(键值)缓存与分页注意力是两种优化LLM推理的关键技术。本文将深入剖析这些概念,阐述其重要性,并探讨它们在仅解码器(decoder-only)模型中的工作原理。https://avoid.overfit.cn/post/db8875…

Nuclei漏洞扫描器:快速、灵活的漏洞检测工具

免责声明 本文旨在介绍有关特定漏洞检测工具或安全风险的详细信息,以帮助安全研究人员、系统管理员和开发人员更好地理解和修复潜在的安全威胁,协助提高网络安全意识并推动技术进步,而非出于任何恶意目的。利用本文提到的漏洞信息或进行相关测试可能会违反法律法规或服务协议…

BUUCTF-Web方向16-20wp

[极客大挑战 2019]PHP 由内容提示应该存在源码备份,常见的如下,一个个尝试 后缀:tar tar.gz zip rar 名字:www web website backup back wwwroot temp访问www.zip,下载下来解压查看index.phpflag.phpclass.php <?php include flag.php;error_reporting(0);class Name{…

【Nginx开发】如何使用Nginx搭建旁路服务器获取客户端IP

一、前言 在实际业务开发过程中,很多时候有记录客户端真实IP的需求,但是从客户端发送的请求往往会经过很多代理服务器,导致后端服务获取的IP为代理以后的IP,不具有业务含义。为了解决这个问题,可以搭建一个旁路服务器,前端在发起请求的时候需要先请求旁路服务器,获取该客…

PyBy2:若依计划任务自动化上线+内存马自动生成v2.0

免责声明 本公众号文章以技术分享学习为目的。由于传播、利用本公众号发布文章而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号及作者不为此承担任何责任。一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!前言 攻防中,遇到一个ruo…

当任务失败时,顶级调度系统如何实现分钟级数据补偿?

一、补数机制的定义与挑战 补数(Backfill) 指在数据管道因系统故障、数据延迟或逻辑错误导致历史任务缺失时,重新调度并执行指定时间范围内的工作流以修复数据缺口。在大数据场景中,补数机制需解决三大核心挑战:复杂依赖链重建:需精准识别历史时间段内任务上下游关系,避…

绿色建筑设计原则与案例分析 - 如何将环保理念融入建筑设计中

在这个追求可持续发展的时代,绿色建筑不仅是一种趋势,更是对地球未来的责任和承诺。它旨在通过最少的环境影响,提供健康、高效、舒适的生活与工作空间。本文将深入探讨绿色建筑设计的核心原则,并通过具体案例分析,揭示如何将环保理念巧妙融入建筑设计之中,为读者呈现一场…

Windows 程序隐藏启动黑窗口总结

免责声明: 该公众号分享的安全工具和项目均来源于网络,仅供安全研究与学习之用,如用于其他用途,由使用者承担全部法律及连带责任,与工具作者和本公众号无关。以下文章来源于锦鲤安全 ,作者四五qq 前言 Windows 控制台程序在启动时会出现一个黑(dos)窗口,一般我们想要隐…

docker部署.net core3.1

1.安装dockerapt install docker.io2.拉取.net core依赖镜像docker pull mcr.microsoft.com/dotnet/core/aspnet:latest3.创建.net core3.1项目 选择docker支持,会生成dockerFile配置文件如图:4.编写dockerfile文件,经删减后为:FROM mcr.microsoft.com/dotnet/core/aspnet:3…

DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了

DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了作者:沉默王二近期有几个热点事件,不知道大家关注到没有?第一个标志事件,一向挑剔的苹果宣布和阿里合作,一起为国行版 iPhone 提供 AI 技术服务。 第二个标志事件,DeepSeek R1 蒸馏了 6 个模型开源给社区,其中有 4 个来…

redission-delay-queue使用及原理

1.引入jar包<dependency><groupId>xxxx.delay</groupId><artifactId>redisson-delayed-queue</artifactId><version>1.0.0-SNAPSHOT</version> </dependency>2.客户端代码开发2.1:新增实现BaseTask的bean 参数由业务自行决定…

利用网页爬虫从专业产品论坛提取评论的完整指南

了解如何通过网页爬虫从专业产品论坛提取评论,以获取可操作的洞见、改进策略,并节省时间。利用网页爬虫从专业产品论坛提取评论已经成为企业的游戏规则改变者。它使您能够从多个平台收集客户反馈(https://dataforest.ai/blog/top-web-scraping-use-cases),实时监控情绪,并自…