Input: [1, 5, 11, 5]
        Output: true
        Explanation: The array can be partitioned as [1, 5, 5] and [11].

#include<iostream>
#include<vector>
using namespace std;//dp[i]表示原数组是否可以取出若干个数字,其和为i
class Solution {
public:bool canPartition(vector<int>& nums) {int sum = 0;for(int i = 0 ; i < nums.size() ; i ++){sum += nums[i];}cout << "sum=" << sum << endl;if(sum % 2 != 0)  //判断整个和是否为偶数return 0;int target = sum / 2;cout << "target=" << sum/2 << endl;vector<int> dp(target + 1, 0);dp[i]表示原数组是否可以取出若干个数字,其和为i dp[0] = 1;  //边界for(int i = 0 ; i < nums.size(); i ++){cout << "nums[i]=" << nums[i] << endl;for(int j = target; j >= nums[i]; j --){   //如果 dp[j - nums[i]] 为true的话,说明现在已经可以组成 j-nums[i] 这个数字了//再加上nums[i],就可以组成数字j了cout << "j=" << j << "," << "dp[j]=" << dp[j] << "," <<  dp[j-nums[i]] << endl;dp[j] = dp[j] || dp[j-nums[i]];}cout << "--------------------------------------------" <<endl;}return dp[target];}
};int main()
{vector<int> temp {1, 3, 2, 4};Solution text;cout << text.canPartition(temp) << endl;return 0;
}

打印:

sum=10
target=5
nums[i]=1
j=5,dp[j]=0,0
j=4,dp[j]=0,0
j=3,dp[j]=0,0
j=2,dp[j]=0,0
j=1,dp[j]=0,1              //dp[1] = 1 ,数组是否可以取出若干个数字,其和为1,因为第一个数为1
--------------------------------------------
nums[i]=3
j=5,dp[j]=0,0
j=4,dp[j]=0,1            //dp[4] = 1 ,数组是否可以取出若干个数字,其和为4,因为dp[1]=1,nums[i]=3,相加和刚好是4
j=3,dp[j]=0,1            //dp[3] = 1 ,数组是否可以取出若干个数字,其和为3,刚好这个数为3
--------------------------------------------
nums[i]=2
j=5,dp[j]=0,1            //dp[5] = 1 ,数组是否可以取出若干个数字,其和为5,因为d[3]=1
j=4,dp[j]=1,0            //dp[4] = 1 ,上面已经为1了
j=3,dp[j]=1,1            //dp[3]和dp[1]都为1
j=2,dp[j]=0,1            //dp[0]为1
--------------------------------------------
nums[i]=4
j=5,dp[j]=1,1           //d[5]和dp[1]都为1
j=4,dp[j]=1,1           //d[4]和dp[0]都为1
--------------------------------------------
1

上面的思路相对数组中每个数求dp,最后就会找到dp[target]是否为true,如果 dp[j - nums[i]] 为true的话,说明现在已经可以组成 j-nums[i] 这个数字了,再加上nums[i],就可以组成数字j了。当j=target是同样道理,要想找到dp[target]为true,就找找到数组中几个值的和为target时,对应下标的dp值为true,这样反推dp[target]为true。

参考地址:https://blog.csdn.net/qq_40320556/article/details/89875463

动态规划之划分数组形成两个和相等的子集相关推荐

  1. python数组分成两个和相等的子集_javascript,_动态规划——把一个整数数组分成两个和相等的子集,怎么写,javascript - phpStudy...

    动态规划--把一个整数数组分成两个和相等的子集,怎么写 当数组nums=[2,3,5]时,测试通过,但当nums=[5,3,2]时,测试就不能通过,这是为什么? window.onload = fun ...

  2. 动态规划系列---求数组中两个元素差的最大值

    题目 求数组中两个元素差的最大值(后面的元素减去前面的元素):对应实际生活中的股票买卖,找出一只股票走势里面可能的最大收益: 思路 类似于求数组连续和的最大值:  保存最大差值和最小值,遍历数组,如果 ...

  3. python数组分成两个和相等的子集_前端面试2

    CSS 1.一个盒子垂直水平居中有哪些方法?(2~3种方法) space-bettewn属性 2.flex怎么使用,flex:1代表了什么(三个属性) 3.使用自适应布局的时候用rem,为什么可以实现 ...

  4. 【算法】动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

    文章目录 一.动态规划场景 二.动态规划分类 1.坐标型动态规划 2.前缀划分型动态规划 3.前缀匹配型动态规划 4.区间型动态规划 5.背包型动态规划 一.动态规划场景 动态规划 动态规划使用场景 ...

  5. LeetCode 2035. 将数组分成两个数组并最小化数组和的差

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.算法详解 3.时间复杂度 4.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述   给你一个 ...

  6. ❤️导图整理数组3: 两数之和II有序数组, 多个有序, 思路全变, 力扣167❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  7. 力扣198.打家劫舍---动态规划与滚动数组

    力扣198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动 ...

  8. LeetCode简单题之数组中两元素的最大乘积

    题目 给你一个整数数组 nums,请你选择数组的两个不同下标 i 和 j,使 (nums[i]-1)*(nums[j]-1) 取得最大值. 请你计算并返回该式的最大值. 示例 1: 输入:nums = ...

  9. 动态开辟二维数组的两种方案及位体

    动态开辟二维数组的两种方案及位体 一.在静态二维数组中查询数据 二.动态开辟二维数组空间 1.用二级指针的方式开辟 2.用结构体的方式开辟 三.位体 先来回顾一下动态开辟一位数组的方法: #inclu ...

最新文章

  1. 《DDIA》读书笔记(一):可靠性、可扩展性、可维护性
  2. jQuery UI 之 LigerUI 快速入门
  3. Quadrant TableViewCell
  4. The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554
  5. 三维旋转四元数系列(3.四元数定义与基本性质)
  6. windows phone, 应用最大内存
  7. 华为商城抢购工具_华为套路太多,MATE40RS开启摇号模式,抽中资格仍需抢购
  8. php 零宽断言,正则表达式之零宽断言
  9. C++学习(四五七)查看dll的几种方式
  10. PHP幸运抽奖系统带后台源码
  11. 2021水利水电安全员考试每日一练单选题库
  12. 考研逻辑整理 - 性质判断及其变形推理
  13. 云坤科技助建“i慧湖”区域创新服务平台
  14. PHP+Mysql 实现数据库增删改查
  15. win10弹出计算机的内存不足,Win10系统提示“计算机内存不足”的解决方法
  16. 数组最大值和最小值的求法
  17. U281819 糟心的语文课
  18. 怎么把word压缩小一点?简单的方法是什么?
  19. 采集需要登录后的网页(重定向后cookie丢失问题)
  20. MATLAB(完备)之图像.tif到真彩色图像、索引色图像、灰度图像、 真彩色图像RGB、YIQ图像、HSV图像、YCbCr图像转换代码

热门文章

  1. 【运筹学】线性规划 人工变量法 ( 人工变量法案例 | 第二次迭代 | 中心元变换 | 检验数计算 | 最优解判定 | 选择入基变量 | 选择出基变量 )
  2. IDE安装Lombok插件提高开发效率
  3. 《转》八大算法详细讲解
  4. struts2官方 中文教程 系列一:创建一个struts2 web Application
  5. JavaEE笔记(五)
  6. 网站优化之尽量避免重定向(301/302)
  7. ie下LI的间距问题
  8. 自定义控件:广告内容后期加载。以及NamingContainer层次的应用
  9. 微信小程序--字体展示
  10. pyinstaller打包后读不到配置文件的解决方法