leetcode416. 分割等和子集(动态规划-java)

news/2024/11/24 23:05:07/

分割等和子集

  • leetcode416. 分割等和子集
    • 题目描述
  • 暴力递归
    • 代码演示
  • 动态规划
    • 解题思路
    • 代码演示
  • 动态规划专题

leetcode416. 分割等和子集

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/partition-equal-subset-sum

题目描述

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

示例 1:
输入:nums = [1,5,11,5]
输出:true
解释:数组可以分割成 [1, 5, 5] 和 [11] 。

示例 2:
输入:nums = [1,2,3,5]
输出:false
解释:数组不能分割成两个元素和相等的子集。

提示:
1 <= nums.length <= 200
1 <= nums[i] <= 100

暴力递归

动态规划其实是对暴力递归的改写,当你对动态规划没有思路时,要先写出暴力递归的尝试,
这道题是典型的 0 -1 背包问题,就是要组成目标和,那我们每到一个位置,都是面临两个选择,选或者不选.分别对两种情况进行递归,最后比较两种递归的情况就可以得到答案了.
还要注意找到base case ,我们代码里注释说明

代码演示

    public boolean canPartition(int[] nums) {if(nums.length == 1){return false;}//计算数组累加和int sum = 0;for(int i = 0 ; i < nums.length;i++){sum += nums[i];}//如果不是偶数没有办法拆分成两个数组和相等if(sum % 2 != 0){return false;}//能找到拆分方式的数量如果不等于0 ,就是可以拆分return process(nums,sum / 2,0) != 0;}/*** 暴力递归* 计算有多少种拆分方式* target 要组成的目标数字* index 来到的下标位置*/public int process(int[]nums,int target,int index){//base case 如果来到越界位置,target == 0,前面选择有效,返回1,代表一种有效方案if(index == nums.length){return target == 0 ? 1 : 0;}//target < 0 说明前面的选择是无效的,返回 0if(target < 0){return 0;}// target == 0 ,前面选择是合法的,返回1.if(target == 0){return 1;}//经典背包解法,选和不选两种情况 //不选时 去 index + 1 位置继续做选择int p1 = process(nums,target,index + 1);//选时 去 index + 1 位置继续做选择,需要组成的数字还剩target - nums[index]int p2 = process(nums,target - nums[index],index + 1);//返回最多的方法数return Math.max(p1,p2);}

动态规划

解题思路

动态规划是对暴力递归的改写,三个步骤,
1.根据base case 初始化dp表
2.递归过程改成从dp 表种拿值得过程
3.返回递归调用得最初始状态,
具体这个问题种,位置如何依赖,如何拿值呢,我用图演示下.
在这里插入图片描述横着得方向是target,竖得方向是index,(演示需要认为数组长度是7,)
首先看,根据base case ,target == 0 时,返回1,所以dp 表种,target = 0 位置,全部初始化为1.
base case 里index 越界时,target = 0 时是1,其余是0,因为java语言本身数组初始化时,元素都是0,所以只需要初始化1出来就好了.
再看一般位置如何求解,以x位置为例.在递归中;
int p1 = process(nums,target,index + 1);
//选时 去 index + 1 位置继续做选择,需要组成的数字还剩target - nums[index]
int p2 = process(nums,target - nums[index],index + 1);
看到,x 依赖,index + 1 位置,正下方(i+ 1,target)的位置,和(target - nums[index],index + 1)这两个位置以五角星位置参考,

  >  所以得出状态转移方程:dp[i][j] = Math.max(dp[i + 1][j] ,dp[i + 1][target - nums[index]]);

代码演示

    /*** 动态规划* @param nums* @return*/public boolean dp(int[] nums){int sum = 0;for(int i = 0 ; i < nums.length;i++){sum += nums[i];}if(sum % 2 != 0){return false;}int N  = nums.length;int target = sum / 2;//动态规划表int[][]dp = new int[N+1][target+ 1];//初始化 target == 0 时的位置为1.for (int i = 0; i <= N ; i++){dp[i][0] = 1;}for(int i = N - 1;i >= 0;i--){for (int j = 0; j <= target;j++){int p1 = dp[i + 1][j];int p2 = 0;//判断位置不能越界if(j - nums[i] >= 0){p2 = dp[i+1][j - nums[i] ];}//状态转移方程dp[i][j] = Math.max(p1,p2);}}return dp[0][target] != 0;}

动态规划专题

leetcode.486. 预测赢家,动态规划

leetcode354. 俄罗斯套娃信封问题

leetcode688. 骑士在棋盘上的概率

leetcode300. 最长递增子序列

填满背包的最大价格

-数字转字符串,有多少种转化结果


http://www.ppmy.cn/news/520195.html

相关文章

0325心得体会

上午学习了 table标签下的 cellspacing\cellpaddingimg标签的三个属性 src alt title 下午接着学了超链接 a标签 它的绝对路径 相对路径 锚点链接总体来说今天的学习收获还是可以的&#xff0c;自己还是需要多练习代码 及难点 易混淆 <table border"1px" width&qu…

中国互联网创业工具库Startup Tools

http://hi.baidu.com/longniao/item/39f13c31084ecdb9633aff81 中国互联网创业工具库Startup Tools 一、第三方创业投资服务平台 1、科技及投资类媒体&#xff08;原创类文章为主&#xff09; 36氪&#xff0c;http://www.36kr.com/ 银海网&#xff0c;http://www.inhai.com/ …

敏捷:从卖皮肤到融入血液

一块死去的敏捷看板 这篇文章&#xff0c;通过一些职场碎片记忆&#xff0c;讲述了我如何从狂热的Agile布道师&#xff0c;转变成一个想从心底抹去Agile烙印的生意人。 Take an economic view 1 这周&#xff0c;在朋友圈看到自己3年前在H公司的照片&#xff0c;颇为感慨。 当时…

【算法】Mice and Cheese 老鼠和奶酪 Greedy

文章目录 Mice and Cheese 老鼠和奶酪问题描述&#xff1a;分析代码 Tag Mice and Cheese 老鼠和奶酪 问题描述&#xff1a; 有两只老鼠和 n 块不同类型的奶酪&#xff0c;每块奶酪都只能被其中一只老鼠吃掉。 下标为 i 处的奶酪被吃掉的得分为&#xff1a; 如果第一只老鼠…

报名软件批次分类code不能为空_为什么金蝶入库单保存时提示批号不能为空

商贸通10.2新增、改进功能和各版本功能差异对比 一、10.2版改进功能&#xff1a; 产品功能 服装 服装普 财务增强包(同标准版10。1) 标准 普 1、基本信息 多编码功能增强 商品档案中可按往来单位类设置 √ √ √ √ 商品重复录入控制 [系统配置]可设置&#xff1a;商品编…

多服务器虚拟化 map_服务器、存储和网络虚拟化的实现与应用

虚拟化技术已经成为数据中心必备的技术之一&#xff0c;那什么叫虚拟化技术呢&#xff1f;虚拟化是一个广义的术语&#xff0c;在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量&#xff0c;简化软件的重新配置过程。CPU的虚拟…

中国互联网创业大咖(收藏)

一、第三方创业投资服务平台 1、科技及投资类媒体&#xff08;原创类文章为主&#xff09; 36氪&#xff0c;http://www.36kr.com/ Tech2ipo&#xff0c;http://tech2ipo.com 动点科技Technode&#xff0c;http://www.technode.com/ 爱范儿&#xff0c;http://www.ifanr.c…

【MYSQL篇】mysql性能优化总结

前言 说到MYSQL性能调优&#xff0c;大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的&#xff0c;每个环节都会消耗时间&#xff0c;我们要减少查询所消耗的时间&#xff0c;就要从每一个环节入手。 关于MYSQL的sql语句执行流程&#xff0…