动态规划|剑指 Offer II 101. 分割等和子集
admin
2024-05-07 13:41:06
0

这题标签是简单,但是难度并不简单,难点在于如何将题目转化成为01背包问题。
而01背包问题如果掌握,这道题只要思路转化过来即可解出。


题目给了一个数组nums,要求说是在数组里面找个一个子集,找个子集的和与剩下的元素组成的子集的和相等。
相当于:一个集合N,是否存在一个子集Q,sum{Q} = sum{N-Q}

sum{Q}意思为集合Q中所有元素相加求和和

这个问题可以放大一点,转化为:nums是否存在子集Q,这个Q的所有元素加起来等于一个tar(tar是一个任意的给定的正整数)。
在这个问题中,当tar=sum/2时,就是该题目原本的解答了。(sum为nums中所有元素的和)。

简洁的说法:nums设为集合N,N是否存在子集Q,sum{Q}=tarsum\{Q\}=tarsum{Q}=tar(tar为一个任意的正整数)。
当tar=sum{N}/2tar = sum\{N\}/2tar=sum{N}/2时就是该题目所要求的答案了

f(i,j)f(i,j)f(i,j)中,j是tar,i是划分的子集。


尝试用y总的dp分析方法分析一下:

f(i,j)f(i,j)f(i,j)代表的集合为:所有的nums的子集.

eg. nums{1,3,4}nums\{1,3,4\}nums{1,3,4}的集合为{{1},{3},{4},{1,3},{1,4},{3,4}}\{\{1\}, \{3\}, \{4\}, \{1,3\}, \{1,4\}, \{3,4\}\}{{1},{3},{4},{1,3},{1,4},{3,4}}

属性:这些集合的和中是否有一个等于jjj

集合划分:集合中是否含有nums[i]nums[i]nums[i]这个元素

状态转移:

nums[i]>jnums[i] > jnums[i]>j时
f[i][j]=f[i−1][j]f[i][j] = f[i-1][j]f[i][j]=f[i−1][j]

nums[i] f[i][j]=f[i−1][j−nums[i]∣f[i−1][j]f[i][j] = f[i-1][j-nums[i] \quad | \quad f[i-1][j]f[i][j]=f[i−1][j−nums[i]∣f[i−1][j]

初始化:

当i=1,nums[0]时,f[i−1][j−nums[i]]f[i-1][j-nums[i]]f[i−1][j−nums[i]]所依赖f[i][0]=truef[i][0]=truef[i][0]=true;f[i−1][j]f[i-1][j]f[i−1][j]依赖的是f[0][nums[0]]f[0][nums[0]]f[0][nums[0]],根据提议可知f[0][nums[0]]=truef[0][nums[0]]=truef[0][nums[0]]=true.因此初始条件为:
f[i][0]=truef[i][0]=truef[i][0]=truef[0][nums[0]]=truef[0][nums[0]]=truef[0][nums[0]]=true

一些前提条件判定的分析就不写了,比如说sum必须为偶数, halfSum > maxNum啥的。

Java代码如下:

class Solution {public boolean canPartition(int[] nums) {int sum = 0, n = nums.length, maxNum = -1;if (n < 2) return false;for(int i : nums) {sum += i;maxNum = Math.max(maxNum,i);}if(sum % 2 != 0) return false;int halfSum = sum / 2;if(maxNum > halfSum) return false;boolean[][] f = new boolean[n][halfSum+1];//初始化//f(i,0)=truefor(int i = 0; i < n; i++) {f[i][0] = true;//这个是朴素写法,可以优化一下,只写f[0][nums[0]] = true;f[i][nums[i]] = true;}for(int i = 1; i < n; i++){for(int j = nums[0]; j <= halfSum; j++){if(j > nums[i]) f[i][j] = f[i-1][j-nums[i]] | f[i-1][j];else f[i][j] = f[i-1][j];}}return f[n-1][halfSum];}
}

相关内容

热门资讯

审核发行上市再融资全面提速,节... 节前最后一周,北交所审核发行上市再融资全面提速。本周两只新股发行申购,两只新股上市,三家企业IPO上...
原创 关... 美印之间那根扎了许久的关税刺,终于被剪掉了一截。 不是磨平,也不是掩盖,而是实实在在地剪断了一部分。...
睿远基金总经理饶刚:骏马奔腾迎... 上证报中国证券网讯(记者王彭)新春佳节来临之际,睿远基金高管发布新春贺词。睿远基金总经理饶刚表示,展...
和讯投顾盖祎楠:春节前最后的交... 2月13日,和讯投顾盖祎楠表示,恐慌情况大概率不会出现在文化传媒板块了,虽说可能还会跌,但恐慌情绪已...
蛇年收官!银行股14万亿市值背... 2月13日(周五),A股迎来2025乙巳蛇年收官。作为年内“价值重估”的代表性板块,银行股在这一年依...
巴克莱警告:AI驱动的抛售势头... 来源:格隆汇APP 格隆汇2月13日|巴克莱银行表示,人工智能驱动的市场抛售可能会持续下去,因投资者...
这些美发方式可能会致癌,春节前... 为了迎接新年,很多人此时都会染发、烫发、直发,但不正确的美发方式,会使癌症风险增加,还会伤害你的头皮...
三诺生物:累计回购约1576万... 每经AI快讯,三诺生物2月13日晚间发布公告称,公司实际回购时间区间为2025年4月7日至2026年...
国际储备货币的主要格局、演进趋... 编者按 自20世纪90年代以来,全球外汇储备规模稳步增长。同时,受地缘经济风险和全球金融市场发展等因...
投入超13亿元!京东春节期间为... 上证报中国证券网讯(记者 刘暄)春节将至,京东集团为员工们送上“豪礼”。京东集团2月13日发布新春贺...
业界首个!蚂蚁开源万亿参数混合... 智东西 作者 | 程茜 编辑 | 李水青 智东西2月13日消息,今天,蚂蚁集团开源全球首个基于混合线...
医疗AI | 美FDA更新网络... 出品 | 搜狐健康 作者 | 周亦川 编辑 | 吴施楠 美国食品药品管理局(FDA)近期发布医疗设备...
基层医疗服务能力提升的回郭镇答... 乡镇卫生院和社区卫生服务中心作为提升基层医疗服务能力建设的重要一环,目前实现了哪些发展?回郭镇卫生院...
LED照明源头厂家_2026国... 光为产业赋能,灯为生活添彩,而LED照明源头制造领域却仍遇发展瓶颈:行业代工模式盛行导致品控标准不一...
换道“超车”,Stellant... 来源:市场资讯 (来源:IT之家) IT之家 2 月 13 日消息,据路透社报道,全球第四大车企 S...
险资投资黄金“周年记”:面对暴... 监管向10家险企开闸投资黄金业务试点已有一年时间。 上海黄金交易所披露的最新数据显示,已有6家险企为...
美股震荡下跌,英伟达、特斯拉、... 当地时间2月13日,美股三大指数集体震荡,红绿交替。截至发稿全线转跌,道指跌0.03%,纳指跌0.3...
巨人网络(002558.SZ)... 格隆汇2月13日丨巨人网络(002558.SZ)公布第二期员工持股计划,本员工持股计划股票来源为公司...
原创 美... 美国兴奋表示,欢迎中方前来投资,石油已经准备好了。 美国能源部长公开说中国买了美国政府手里的部分委内...
徽商银行:怀揣“空杯心态” 打... “成立20年来,我们立足安徽科创特色,怀揣‘空杯心态’,创新科技金融服务模式,打造‘科创银行’。”刚...