前两天,写了一篇文章:动态规划 第4讲: 01背包问题&空间简化 (基础入门篇),作为初步了解,接下来做几道题来巩固一下,每道题都有最初版和空间优化版的代码。
一、416. 分割等和子集 (难易程度:medium)
原题链接:https://leetcode-cn.com/problems/partition-equal-subset-sum
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
空间优化前的代码:
class Solution {
public:
bool canPartition(vector<int>& nums) {
if(nums.size()<=1) return false;//只有一个或者没有,不可分割
int n=nums.size(), half=0;
for(int i=0; i<n; i++) half+=nums[i];
//和为奇数时,不可能划分成两个和相等的集合
if(half%2==1) return false;
half/=2;
//dp数组保留第0行和第0列,预防分类讨论
vector<vector<bool>>dp(n+1, vector<bool>(half+1, false));
dp[0][0]=true; //初始值为true
for(int i=1; i<=n; i++)
{
for(int j=1; j<=half; j++)
{
if(