首页 > 其他分享 >【力扣】分割等和子集(不太像01背包的01背包)

【力扣】分割等和子集(不太像01背包的01背包)

时间:2024-03-14 20:44:45浏览次数:27  
标签:01 return nums sum 不太像 背包 dp

题目描述

image

分析

出题人肯定是要尽量避免太直接的模版套用
像这题一样,挖了很多坑。
首先是题目很难让人第一时间联想到01背包
这道题换一种描述方法就是找到一个子集,使子集的元素值总和刚好等于原集合之和的一半。
也就是说是一个背包容量为sum/2的01背包问题
另外,化解为这样之后你又会发现和写的和前面的模板题又不一样,因为这道题的求解并不是装进物品的最大价值,而是使背包刚好装满。
这样的话dp数组的元素就不是物品价值,而是装进物品的重量
于是得到dp数组的长度为sum+1
而且有递推公式为:

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

得到代码如下:

class Solution {
public:
    bool canPartition(vector<int>& nums) {
        if(nums.size() == 1 ||(nums.size() == 2 && nums[0] != nums[1])){
            return false;
        }
        int sum = accumulate(nums.begin(),nums.end(),0);
        if(sum%2){
            return false;
        }
        sum/=2;
        //到这里就变成了一个背包容量为sum的01背包问题
        vector<int> dp(sum+1,0);
        for(int i = 0; i < nums.size(); i++){
            for(int j = sum; j >= nums[i]; j--){
                dp[j] = max(dp[j],dp[j-nums[i]]+nums[i]);
                if(dp[j] == sum){
                    return true;
                }
            }
        }
        return false;
    }
};

后记

不能死板地套用模版,而是要理解清楚动态规划的原理,把分析五步骤和数组的设置原理搞清楚
image
image
image
image

image

标签:01,return,nums,sum,不太像,背包,dp
From: https://www.cnblogs.com/satsuki26681534/p/18073913

相关文章

  • 代码随想录算法训练营第四十六天| 139.单词拆分 多重背包 背包问题总结篇!
    单词拆分 题目链接:139.单词拆分-力扣(LeetCode)思路:竟然真能转化为背包问题。classSolution{public:boolwordBreak(strings,vector<string>&wordDict){unordered_set<string>t(wordDict.begin(),wordDict.end());vector<bool>dp(s.size()+......
  • PHP-CGI远程1代码执行漏洞(CVE-2012-1823)
    影响版本php<5.3.12orphp<5.4.2测试环境cdphp/cve-2012-1823docker-composeup-d访问http://your-ip:8080/index.php?-s即爆出源码,说明漏洞存在。发送如下数据包,可见Body中的代码已被执行:POST/index.php?-d+allow_url_include%3don+-d+auto_prepend_file%3dphp%3a......
  • 洛谷 P3596 [POI2015] MOD 题解
    题意简述给定一棵树,求断掉一条边再连上一条边所得的新树直径最小值和最大值,以及相应方案(你可以不进行任何操作,即断掉并连上同一条边)。题目分析假设我们枚举断掉某一条边,得到了两棵树,并且知道它们的直径分别为\(d_0,d_1\),那么如何连接一条边让新树的直径最大/最小呢?最大:显......
  • 洛谷 P3261 [JLOI2015] 城池攻占 题解
    题目分析其他人要么倍增,要么左偏树,那我就来讲讲朴实无华的dfs序加上线段树的做法。首先发现题目中明确指出了作乘法的时候一定是乘上一个大于零的数,这是为什么呢?首先把可以占领当前城池的战斗力的不等式列出来:\[h_j\le\left\{\begin{array}{c}s_i\timesv_j&&{a_j=......
  • Coursera自然语言处理专项课程01:Natural Language Processing with Classification an
    NaturalLanguageProcessingwithClassificationandVectorSpacesCourseCertificate本文是NaturalLanguageProcessingwithClassificationandVectorSpaces这门课的学习笔记,仅供个人学习使用,如有侵权,请联系删除。文章目录NaturalLanguageProcessingwi......
  • 01了解操作系统
    硬件和软件们所熟知的计算机是由:硬件和软件所组成硬件计算机系统中由电子,机械和光电元件等组成的各种物理装置的总称软件软件是用户和计算机硬件之间的接口和桥梁,用户通过软件与计算机进行交流。而操作系统,就是软件的一类。操作系统操作系统是计算机软件的一种,它主要负......
  • CTF练习日记——[HCTF 2018]WarmUp 1
    一点进去就是一个大大的笑脸,暂时没有头绪,点开页面源码试试看发现了一个source.php,从这里入手试试呢能看到在source.php中有许多的if语句,猜测适用于验证过滤啥的,但看的不是太懂,一个个分析下先这里isset()验证变量是否声明,is_string判断是否是字符串,只要有一个不符合,就会输出......
  • CTF练习日记——[极客大挑战 2019]EasySQL
    启动靶机后,首先能看到这样一个界面:这个题是和SQL注入相关,首先随意输入username和password试试看:提示用户名和密码错误,那么我们尝试输入用户名输入1',得到提示SQL语句出错,那么我们就可以从这里下手,直接在用户名那输入1'or'1'='1#注入成功,得到了我们需要的flag:flag{08f72......
  • [Ynoi2013] 大学
    非常好之\(\texttt{lxl}\)使我的代码旋转。看到这个题,第一反应显然是如果我们能够每次确切的找到要除的数,然后用树状数组进行单点修改,那么就可以达到\(\mathcal{O}(n\logV\logn)\)的复杂度。那么接下来就是考虑如何去找到能除的数。首先,我们不难想到对于每个权值\(v\)......
  • CDH - [01] 概述
      一、什么是CDH  CDH是Cloudera'sDistributionIncludingApacheHadoop的缩写,即Cloudera公司发布的Hadoop发行版。它是一个为Hadoop构建的企业级数据平台,提供了Hadoop核心组件的预编译、测试和优化的版本,以及管理这些组件的工具和附加功能。Cloudera提供了易于安装、配......