【编程题-错题集】分割等和子集(动态规划 - 01背包)

牛客对应题目链接:分割等和子集_牛客题霸_牛客网 (nowcoder.com)

力扣对应题目链接:416. 分割等和子集 - 力扣(LeetCode)


一、分析题目

01 背包 问题:将原问题转换成:从 n 个数中选,总和恰好为 sum / 2,看能否挑选出来。
  • 状态 dp[i][j] 表示:从前 i 个数中挑选,总和恰好为 j,能否凑成。
  • 状态转移方程:dp[i][j] = dp[i-1][j] || dp[i-1][j-arr[i]],第二个状态必须保证 j>= arr[i]
  • 初始化:dp[0][0] = true
  • 返回值:dp[n][sum/2]

二、代码

1、值得学习的代码

//牛客
#include <iostream>
using namespace std;

const int N = 510, M = 510 * 110 / 2;

int n;
int arr[N];
int dp[N][M];

int main()
{
    cin >> n;
    int sum = 0;
    for(int i = 1; i <= n; i++)
    {
        cin >> arr[i];
        sum += arr[i];
    }

    if(sum % 2 == 1) cout << "false" << endl;
    else
    {
        sum /= 2;
        dp[0][0] = true;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j <= sum; j++)
            {
                dp[i][j] = dp[i - 1][j];
                if(j >= arr[i])
                {
                    dp[i][j] = dp[i][j] || dp[i - 1][j - arr[i]];
                }
            }
        }
        if(dp[n][sum]) cout << "true" << endl;
        else cout << "false" << endl;
    }

    return 0;
}

2、力扣 AC 代码(推荐)

//二维dp
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        for(auto e:nums)
            sum+=e;
        if(sum%2==1)
            return false;
        int target=sum/2;
        vector<vector<int>> dp(n, vector<int>(target+1));
        for(int i=1; i<n; i++)
        {
            for(int j=0; j<=target; j++)
            {
                if(j>=nums[i])
                    dp[i][j]=max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i]);
                else
                    dp[i][j]=dp[i-1][j];
                if(dp[i][j]==target)
                    return true;
            }
        }
        return false;
    }
};

//一维dp
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        for(auto e:nums)
            sum+=e;
        if(sum%2==1)
            return false;
        int target=sum/2;
        vector<int> dp(20010);
        for(int i=1; i<n; i++)
        {
            for(int j=target; j>=nums[i]; j--)
            {
                dp[j]=max(dp[j], dp[j-nums[i]]+nums[i]);
                if(dp[j]==target)
                    return true;
            }
        }
        return false;
    }
};

三、反思与改进

刚拿到这道题就直接暴力破解了,竟然还通过了 90% 的样例,导致我一度怀疑是不是有哪个特殊样例没考虑到。对数组直接进行排序,然后对总和进行判断,奇数直接 false,偶数就取总和的一般 half 作为 目标值 target,接着遍历数组进行累加,刚好等于 half 则为 true,但这样做就忽略了所选的元素可能不是连续的这一点,所以这是错的。

一般遇到这种等于 target 值的题目可以考虑背包问题。

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

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

相关文章

PPT为何无法复制粘贴?附解决办法!

PPT文件里的内容无法复制&#xff0c;或者复制后无法粘贴&#xff0c;这是怎么回事呢&#xff1f; 这种情况&#xff0c;一般是因为PPT被设置了保护&#xff0c;设置了以“只读方式”打开&#xff0c;就无法进行复制粘贴了。PPT的“只读方式”不同&#xff0c;解决方法也不同&…

在 pyGTK 中使用 visibility_notify 事件

问题背景 在 Windows 系统中开发 pygtk 应用程序时&#xff0c;需要知道何时一个窗口被另一个窗口遮挡或显示&#xff0c;以便停止繁重的绘图进程。为此&#xff0c;可以使用 visibility_notify_event 信号来获取窗口可见性状态的改变。 解决方案 可以使用 visibility_notif…

iRemovalPro完美解4G信号,支持A12+,支持6S~14ProMax,支持iOS17.4+

iRemovalPro是一款绕过激活锁界面的解锁工具&#xff0c;可以激活所有iPhone/ipad恢复信号&#xff0c;并且支持插卡接打电话、收发短信、4G流量上网&#xff0c;支持iCloud登录&#xff0c;有消息通知&#xff0c;支持iPhone6S~14ProMax的所有型号&#xff0c;支持iOS15-iOS17…

腾讯和OpenAI盯上了同一条赛道

图为&#xff1a;腾讯文生图负责人芦清林 AI多模态大模型持续火热&#xff0c;腾讯也出招了 5月14日&#xff0c;腾讯宣布旗下的混元文生图大模型全面升级&#xff0c;该模型采用了与Sora一致的DiT架构&#xff08;Diffusion With Transformer&#xff09;&#xff0c;不仅可支…

在另外一个页面,让另外一个页面弹框显示操作(调佣公共的弹框)vue

大概意思是&#xff0c;登录弹框在另外一个页面中&#xff0c;而当前页面不存在&#xff0c;在当前页面中判断如果token不存在&#xff0c;就弹框出登录的弹框 最后一行 window.location.href … 如果当前用户已登录&#xff0c;则执行后续操作(注意此处&#xff0c;可不要)

FANUC机器人初始化系统的基本方法和步骤

FANUC机器人初始化系统的基本方法和步骤 首先,在做系统初始化之前,必须做好系统的备份,这里做个镜像备份,更详细的镜像备份步骤可参考以下链接中的内容: FANUC机器人进行全部备份和镜像备份以及加载备份文件的具体操作(图文) 如下图所示,在示教器右边的USB接口上插个…

记录用python跑csdn点赞接口

代码如下 # 导入request包 import requests # 请求URL URL3https://blog.csdn.net//phoenix/web/v1/article/like # 入参 data3{articleId:109552419} # 请求头 headers3{cookie:uuid_tt_dd10_30308678820-1713771851124-190368; loginbox_strategy%7B%22taskId%22%3A349%2C%2…

1755jsp学生信息管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java 学生信息管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;…

酷开科技丨女性群像大戏《惜花芷》在酷开系统热播中

在这个国产剧市场蓬勃发展的时代&#xff0c;酷开科技通过其生态智能电视系统&#xff0c;为剧迷们打造了一个精彩的观剧平台。通过酷开科技的智能推荐算法&#xff0c;消费者能够轻松地发掘并观看各种题材的高质量剧集&#xff0c;无论是扣人心弦的金融较量、深刻的家庭代际关…

位图和布隆过滤器:位图

在《unordered_map 和 unordered_set》 中提到过&#xff1a; 哈希是一种思想&#xff0c;通过哈希函数将数据转化为一个或多个整型 —— 映射关系&#xff1b;通过这种映射关系&#xff0c;可以做到以 O(1) 的时间复杂度查找数据。 本文即将介绍的 位图 和 布隆过滤器 就是两个…

vue 微信小程序 uniapp 微信头像上传裁剪功能

效果如图&#xff1a; 操作流程&#xff1a; 个人中心–点击设置头像–选择图片-裁剪–选取–上传 template <view class"meilan" style"position: relative;"><u-row justify"space-between"><u-col span"3">设置头…

开源的图形化Windows软件安装升级方案:WingetUI

WingetUI&#xff1a;简化数字生活&#xff0c;WingetUI让软件管理轻松便捷- 精选真开源&#xff0c;释放新价值。 概览 WingetUI是在GitHub上开发的一个实用工具&#xff0c;专为Windows用户设计&#xff0c;旨在为常见的命令行包管理工具&#xff08;如Winget、Scoop、Pip、…

即刻报名:南京智博会|2024南京国际人工智能展览会

在21世纪的科技浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;无疑已经跃升为一个全新的战略制高点&#xff0c;成为驱动社会经济发展的重要引擎。2024年11月&#xff0c;南京这座历史与现代交融的城市&#xff0c;将举办一场科技界的盛宴——2024南京国际人工智能展览…

指标体系建设方案(36页PPT)

一、资料介绍 《指标体系建设方案》这份36页的PPT资料包&#xff0c;是针对当前组织发展需求而精心设计的一套全面、系统的指标构建方案。本资料包从理论到实践&#xff0c;深入浅出地阐述了指标体系建设的必要性、原则、步骤及实施要点&#xff0c;旨在帮助组织建立起科学、合…

在Python中防止某些字段被Pickle序列化

在Python中&#xff0c;如果你想防止某些字段被pickle序列化&#xff0c;可以使用__reduce__()方法来自定义pickle行为。__reduce__()方法允许你返回一个元组&#xff0c;其中包含要在对象被pickle时调用的函数以及传递给该函数的参数。下面就是我遇到的问题以及最终解决方案。…

Mamba:7 VENI VIDI VICI

若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果构建生成级别的AI架构则可以关注AI架构设计。技术宅麻烦死磕LLM背后的基础模型。 序列模型的效率与有效性之间的权衡取决于状态编…

【自然语言处理】形式语言和自动机

实验名称 形式语言和自动机 实验目的&#xff1a;熟悉形式语言和自动机&#xff0c;设计程序实现有限自动机&#xff0c;学习对字符串进行合法性检测&#xff0c;使用有限自动机判断字符串是否是可以被接受的。书写出能够成功运行的代码。 实验内容&#xff1a;状态集为{ q0,…

职业生涯第一课---“Redis分布式锁优化:确保唯一性与效率“

前言 最近因为刚入职公司开启自己的实习生涯&#xff0c;工作和毕设论文同步进行&#xff0c;导致有段时间没更新博客了&#xff0c;今天来分享一下最近学到的一些知识。 场景介绍 BOSS让我写一些接口&#xff0c;他提出这样一个需求&#xff0c;该接口的参数有多个&#xf…

linux系统查看CPU信息

1、查看cpu型号 [rootMaster ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 40。Intel(R) Xeon(R) CPU E5-2650 v3 2.30GHz 2、查看系统中实际物理CPU的颗数&#xff08;物理&#xff09; [rootMaster ~]# grep physical id /proc/cpuinfo | sort | uniq | w…

IT行业现状与探索未来发展趋势

​​​​​​​ 我眼中的IT行业现状与未来趋势 随着技术的不断进步&#xff0c;IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链&#xff0c;这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是…