Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal.

思路
这道题假如能看出是一道0-1背包问题的话,就很好解决了。题目说需要划分成两个和相等的子集,那么需要满足:
1.每个元素必须被使用且只能被使用一次
2.两个子集的和相等,子集和相加必为偶数

根据子集和相加必为偶数这一点,当nums数组元素和sum是奇数时,直接return false。那么接下来问题就可以转化成能否选取几个物品使其重量和为sum/2的问题。

状态转移方程
dp[i][j] = true, when dp[i-1][j] == true
dp[i][j] = true, when j == nums[i]
dp[i][j] = dp[i-1][j-nums[i]], when j > nums[i]

边界条件
若nums[0] <= sum/2,dp[0][0] = true

注明
为什么此处的初始化不像一般的背包问题那样是个循环呢,我想了一下一般的背包问题是求最大价值和的,所以需要循环一般dp[0][j]记录各自中间值。而本题中不需要记录中间值,只需要判断是true还是false,因此仅需判断dp[0][0]是否为true即可。

代码

class Solution {public:bool canPartition(vector<int>& nums) {int sum = 0;int len = nums.size();for(auto num : nums)sum += num;if(sum % 2) return false;int bag_size = sum / 2;bool dp[205][10005] = {false};if(nums[0] <= bag_size)dp[0][nums[0]] = true;for(int i = 1; i < len; i++)for(int j = 0; j <= bag_size; j++){if(dp[i-1][j] == true)dp[i][j] = true;else if(j == nums[i])dp[i][j] = true;else if(j > nums[i])dp[i][j] = dp[i-1][j-nums[i]];}return dp[len-1][bag_size];}
};

LeetCode动态规划 分割等和子集相关推荐

  1. LeetCode 416 分割等和子集

    LeetCode 416 分割等和子集 题目链接 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会 ...

  2. [动态规划] leetcode 416. 分割等和子集

    问题描述:    分割等和子集:给你一个只包含正整数的非空数组 nums .请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等.   例子:输入nums = {1, 5, 11 , 5 ...

  3. LeetCode 416. 分割等和子集 【c++/java详细题解】

    来自专栏<LeetCode高频面试题> 欢迎订阅 目录 1.题目 2.思路 3.二维c++代码 4.二维java代码 5.一维优化 6.一维c++代码 7.一维java代码 1.题目 给你 ...

  4. leetcode - 416. 分割等和子集

    416. 分割等和子集 -------------------------------------------- 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和 ...

  5. Java实现 LeetCode 416 分割等和子集

    416. 分割等和子集 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: ...

  6. leetcode 416. 分割等和子集

    分割等和子集题解集合 DFS 记忆化搜索 记忆化搜索的另一种写法 动态规划 「滚动数组」解法 「一维空间优化」解法 DFS 思路 题意就是:给你一个非空数组,和为sum,你能否找到一个子序列,和为su ...

  7. LeetCode 416. 分割等和子集(动态规划)

    1. 题目 给定一个只包含正整数的非空数组. 是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [ ...

  8. LeetCode 416. 分割等和子集(动态规划)(0-1背包)

    题目描述 给定一个只包含正整数的非空数组.是否可以将这个数组分割成两个子集,使得两个子集的元素和相等. 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, ...

  9. 动态规划:leetcode 416 分割等和子集(背包问题应用)

    题目链接:力扣 定义dp数组:dp[i][j]表示能否从nums下标0~j任意选择数,使它们之和为j,dp数组为bool类型 状态转移方程:下标为i的数不选,dp[i][j]等价于dp[i-1][j] ...

最新文章

  1. Neutron 如何支持多种 network provider - 每天5分钟玩转 OpenStack(70)
  2. js中的cookie使用和vue-cookie的使用
  3. MybatisPlus 通用枚举无法正确取值
  4. POJ1149 最大流(Isap)
  5. 3层b+树索引访问磁盘次数_深入理解MySQL索引底层实现原理丨技术干货
  6. Grep与web漏洞挖掘转
  7. TiDB 源码阅读系列文章(二十)Table Partition
  8. c语言oj查重,GitHub - shawnsky/hshe: Online Judge System 在线评测系统 代码查重 作业质量...
  9. React移动端适配方案
  10. 网页压缩 - GZIP
  11. oracle18c静默安装教程,centos7安装Oracle18c
  12. 从淘宝P5到天猫总监,她的阿里十年发生了什么?
  13. Python如何使用Any和All?代码示例和解析
  14. php wordpressCMS 网站局域网搭建--笔记
  15. 解锁图案-九宫格有多少种组合?安全吗?用程序来解答
  16. android mkdir失败_在/ sdcard中创建目录失败
  17. 浏览器缓存机制 过期机制和验证机制
  18. 凛冬至送温暖,无价资源免费送
  19. Matlab学习-经纬度在matlab内置地图显示
  20. Flash媒体服务器

热门文章

  1. 微信又添新功能!这个微信群可以学英语,而且全程免费
  2. 不懂物理,何以谈科技?
  3. Python项目可以有多大?最多可以有多少行代码?
  4. 每天6亿人在看《延禧攻略》?大数据告诉你哪家视频网站VIP值得买(附代码)
  5. python核心模块之pickle和cPickle讲解
  6. jmeter xml 请求_Jmeter学习笔记(十六)——HTTP请求之content-type
  7. sql连接远程服务器索引超出了_手机怎么连接服务器远程桌面?RD client远程桌面使用教程...
  8. 单文件组件的组件传值_移动端组件化架构(下)
  9. 嵌入式linux配置qt,基于qt的嵌入式Linux开发环境搭建
  10. aggregation java_Elasticsearch Aggregation 多个字段分组统计 Java API实现