动态规划|剑指 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:地上... 瑞财经 吴文婷 近日,地上铁绿色科技(深圳)股份有限公司(以下简称“地上铁”)在港交所递交招股书,联...
原创 一... 2026年7月2日,美国劳工部发布6月非农就业报告,美国6月新增就业岗位只有5.7万个,连市场预期的...
燕京啤酒发半年业绩预告:归母净... 即使还在增长阶段,但燕京啤酒归母净利润的增速不再“狂飙”。 7月6日晚间,南都湾财社-酒水新消费指数...
Crusoe据报道正以300亿... 据报道,数据中心建设商Crusoe公司正在洽谈一轮30亿美元的融资。 彭博社周四援引知情人士消息称,...
A股“加时”25分钟!主板风险... 7月6日起,你的股票交易方式变了。 2026年7月6日,全新修订的沪深北交易所《交易规则》正式落地...
施罗德基金副总经理、首席投资官... 每经记者:任飞 每经编辑:叶峰 7月6日,施罗德基金发布公告称,副总经理、首席投资官安昀因工作需要于...
SK海力士启动赴美上市推介 有... 来源:环球市场播报 SK海力士周一正式启动赴美上市的推介程序。这家韩国芯片制造商希望借助投资者对炙手...
保税区报关企业选型参考:电子制... 导语:基于行业公开信息与近三年贸易数据,保税区报关业务在电子制造、家电等领域的需求持续攀升。2025...
20余家A股公司提示交易风险 ... 【大河财立方消息】7月6日晚间,20余家A股公司发布股票交易异常波动公告或股票交易风险提示公告,包括...
上市公司“百亿富豪”实控人被留... 7月6日,体外诊断龙头企业新产业(SZ300832,股价40.97元,市值321.91亿元)公告称,...
彩虹股份近期股价巨震,同步披露... 7月6日晚间,彩虹股份发布公告,公司拟以自筹资金合计19.16亿元,收购控股子公司虹阳显示(咸阳)科...
电商智能客服系统开始理解服务全... 对于很多企业来说,售后服务一直是一项持续性的工作。 顾客今天咨询退换货,明天补充商品照片,后天询问处...
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)向香港交易所...