首页 > 其他分享 >动态规划-背包问题——416.分割等和子集

动态规划-背包问题——416.分割等和子集

时间:2024-11-11 23:15:10浏览次数:7  
标签:背包 nums int sum 位置 416 子集 dp

1.题目解析

题目来源

416.分割等和子集——力扣

测试用例 

2.算法原理

1.状态表示

这里背包问题基本上和母题的思路大相径庭,母题请见 [模板]01.背包 ,这里的状态表示与装满背包的情况类似,第二个下标就是当选择的物品体积直接等于j时是否可以装入"背包",本题是求是否可以将一个数组分为大小相等的两部分,不妨变换思路,求出是否可以找一些数字的和等于该数组的一半,即

dp[i][j]:选择[1,i]区间的物品,此时总"体积"完全等于j时是否可以装入"背包"

2.状态转移方程

状态转移方程需要判断最后一个位置是否可以装入"背包",以此来判断此时位置的状态

1.当不选择当前位置:dp[i][j] = dp[i-1][j],不选择则"体积"不变,也就是j不变

2.选择当前位置:需要找到前面位置是否存在,也就是dp[i-1][j-nums[i-1]],注意判断j>=nums[i-1],不然就不能使用该位置的状态

3.初始化

开辟了虚拟位置,需要对虚拟位置进行初始化

4.填表顺序

从上到下,每一行从左到右

5.返回值 

返回最后一个位置的dp值

3.实战代码

class Solution {
public:
    bool canPartition(vector<int>& nums) 
    {
        int m = nums.size();
        int sum = 0;
        for(auto e : nums)
        {
            sum += e;
        }    
        int aim = sum / 2;

        if(sum % 2 == 1)
        {
            return false;
        }
        vector<vector<bool>> dp(m+1,vector<bool>(aim+1));
        for(int i = 0;i <= m;i++)
        {
            dp[i][0] = true;
        }

        for(int i = 1;i <= m;i++)
        {
            for(int j = 1;j <= aim;j++)
            {
                dp[i][j] = dp[i-1][j];
                if(j >= nums[i-1])
                {
                    dp[i][j] = dp[i][j] || dp[i-1][j-nums[i-1]];
                }
            }
        }
        return dp[m][aim];
    }
};

代码解析 

代码优化 

 

标签:背包,nums,int,sum,位置,416,子集,dp
From: https://blog.csdn.net/2301_80689220/article/details/143696458

相关文章

  • 数字逻辑电路-74194模5扭环形计数器、74160同步7-23加计数器-Quartus2-时序逻辑电路:
    (建议两个实验分成两个项目做,只有LowFreqClk设计会重复)(有些地方会省略文件置顶和编译,有问题的话看看是不是文件没置顶或没编译)一、实验预习:用双向移位寄存器74194和门电路设计一个右移模5的扭环计数器;并画出电路图二、实验内容:1.双向移位寄存器74194的应用——扭环形......
  • 「笔记」可撤销背包
    目录写在前面引入分析代码例题AtCoderABC321FCF1111DCCPC2024HarbinE写在最后写在前面vp24harbin时E前面的一切全都会了就是不会撤销背包,以为要上多项式科技于是跑路了,vp快结束了跟坐牢计算几何的dztlb大神一说他说他会呃呃,完蛋。引入P4141消失之物:给定\(n\)......
  • 78. 子集
    题目链接解题思路从左往右的尝试,暴力递归(回溯),process(index,path),来到index,两种情况,要index的数,或者不要index的数代码classSolution{public:voidprocess(vector<vector<int>>&ans,constvector<int>&nums,intindex,vector<int>&path){......
  • 背包九讲——背包问题求方案数
    目录背包问题求方案数1.01背包问题题目链接:11.背包问题求方案数-AcWing题库算法实现:代码实现:问题变形: 解决方法:2.多重背包问题3.完全背包问题背包问题第八讲——背包问题求方案数背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最......
  • # 学期2024-2025-1 学号20241416《计算机基础与程序设计》第7周学习总结
    这个作业属于哪个课程 https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP/这个作业要求在哪里 https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07这个作业的目标 数组与链表、基于数组和基于链表实现数据结构、无序表作业正文 https://www.cnblogs.com/rockytyh/p/1......
  • 动态规划-背包01问题推理与实践
    动态规划-背包01问题推理与实践背包01问题描述:有storage大小的背包和weights.size()数量的物品,每个物品i对应的物品大小为sizes[i],价值为values[i],在不超过storage大小的情况下,如何装载物品使背包中的values和最大.物品大小:vector<int>sizes;物品价值:vector<int>v......
  • 笔试题11 -- 装箱问题(01背包)
    装箱问题(01背包)文章目录装箱问题(01背包)一、原题复现二、思路剖析三、示例代码题目链接:NOIP2001装箱问题一、原题复现题目描述有一个箱子容量为V(正整数,0≤V≤20000),同时有n个物品(0<n≤30),每个物品有一个体积(正整数)。要求n个物品中,任取若干个装入箱内,使箱子......
  • 树上背包
    树上的背包问题,也就是背包问题与树形DP的结合。例题:P2014[CTSC1997]选课有\(n\)门课程,第\(i\)门课程的学分为\(a_i\),每门课程有零门或一门先修课,有先修课的课程需要先学完其先修课,才能学习该课程。一位学生要学习\(m\)门课程,求其能获得的最多学分数。数据范围:\(n,m......
  • 代码随想录 -- 动态规划 -- 分割等和子集
    416.分割等和子集-力扣(LeetCode)思路:题目中表述:将数组nums分割成两个子集,使得两个子集的元素和相等。可以转化为:有一个背包,如果存在部分元素组合可以令容量为nums的和的一半的背包容纳的最大价值也为nums的和的一半,那么剩下的元素和也是nums的一半,则符合题意。dp[j]含义:......
  • 代码随想录算法训练营 day37 day38| 卡码网52.完全背包 518. 零钱兑换 II 377.
    学习资料:https://programmercarl.com/背包问题理论基础完全背包.html#算法公开课相比于01背包,完全背包中每个物品都可以无限次的放入组合:先遍历物品,再逆序遍历背包排列:先逆序遍历背包,再遍历物品学习记录卡码网52.携带研究资料(dp[i]代表当重量为i时的最大价值)点击查看代码n......