动态规划|剑指 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];}
}

相关内容

热门资讯

电商智能客服系统开始理解服务全... 对于很多企业来说,售后服务一直是一项持续性的工作。 顾客今天咨询退换货,明天补充商品照片,后天询问处...
AI算力需求强劲,数字经济ET... 截至7月6日13点45分,上证指数涨0.19%,深证成指跌0.32%,创业板指跌0.61%。猪肉、青...
华电国际在武汉成立智慧能源科技... 企查查APP显示,近日,华电(武汉)智慧能源科技有限公司成立,法定代表人为汪俊,注册资本为2000万...
金价因美元走强从两周高点回落,... 随着美元走强,黄金价格在触及两周高点后小幅下跌。市场正在等待本周稍晚公布的美联储最近一次货币政策会议...
中远海控:拟回购5000万至1... 上证报中国证券网讯(记者 黄璐婧)中远海控公告,公司拟以集中竞价交易方式回购A股股份,回购数量为50...
壁仞科技上市半年后开启配售:拟... 瑞财经 吴文婷7月5日,壁仞科技发布公告称,公司于7月4日与配售代理签订配售协议,拟以每股46.2港...
半年108将换岗,上市物企高管... 文/乐居财经 徐酒眠 2026年上半年,上市物企的人事变动公告几乎从未断过。 从年初保利物业的“换血...
四方精创更新港股招股书:6.3... 财通社——7月5日,深圳四方精创资讯股份有限公司(简称“四方精创”,300468.SZ)向香港交易所...
超级IPO动作不断!SK海力士... 来源:中国基金报 【导读】受股价波动影响,SK海力士下调预计发行规模至280亿美元;上月末,新增美国...
乌审旗财政局:加强预算绩效管理... 近年来,乌审旗财政局强化工作举措,加强预算绩效管理,充分运用预算“一体化”信息管理系统,全面衔接事前...
【Fintech 周报】上半年... 【Fintech周报是由钛媒体TMTpost发布的特色产品,将整合本周最重要的金融科技行业的监管政策...
芯片狂欢降温?大摩Wilson... 美国股市短期内难以再创新高,资金正从今年涨幅最大的半导体股票流出,转向AI超大规模云计算商(hype...
欧洲稳定机制警告称双重冲击可能... 欧元区救助基金呼吁各国政府重建财政缓冲能力,以帮助经济抵御未来可能出现的冲击,包括地缘政治局势进一步...
王苏龙任富国基金董事长 天眼查App显示,近日,富国基金管理有限公司发生工商变更,裴长江卸任法定代表人、董事长,陈戈接任法定...
原创 每... 【阅读须知】本文内容所有信息和数据,均为作者查阅官方信息和网络已知数据整合解析,旨在让读者更清晰了解...
深圳普渡机器人,拟赴港上市,累... 来源:滚动播报 来源:财通社 据日经亚洲6月3日报道,普渡机器人创始人兼CEO张涛接受采访时表示,公...
女性高发桥本,和长期焦虑密不可... 临床数据显示,桥本甲状腺炎的发病群体以女性为主,女性发病率远高于男性。女性高发桥本,核心原因和长期焦...
原创 3... 原定任期至2028年6月22日的黄黎明辞去光明乳业董事长职务 投资时间网、标点财经研究员 李路 ...
沪指震荡微跌,煤炭、银行等板块... 7月6日,沪指早盘探底回升,随后窄幅震荡;创业板指弱势下探,A股市场超3500股飘绿。 截至收盘,沪...
全球首发:中国镓仁半导体建成6... 7 月 6 日消息,杭州镓仁半导体有限公司(下称“镓仁半导体”)今年 6 月宣布,基于自研铸造法单晶...