求分享 416 的衍生问题的解题思路

2020-11-16 09:38:10 +08:00
 tamer

https://leetcode-cn.com/problems/partition-equal-subset-sum/

先贴原题:



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

注意:

每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:

输入: [1, 5, 11, 5]

输出: true

解释: 数组可以分割成 [1, 5, 5] 和 [11].

如果现在元素可以弃置,也就是不放入任何一个子集中,求弃置最少元素的分割成 2 个等元素和子集的方案.

如[1,1,3]
即分割成[1][1],3 弃置

目前就想到暴力算法复杂度 3 的 n 次方 ,求个优化思路或者更优方案, 去重 /回溯的剪枝目前也没好的办法

2345 次点击
所在节点    LeetCode
9 条回复
guchengyehai1
2020-11-16 15:02:15 +08:00
guchengyehai1
2020-11-16 15:18:06 +08:00
不过从 dp 的角度看,有每个元素三种选择,给第一个子集,给第二个子集,扔掉
guchengyehai1
2020-11-16 15:34:09 +08:00
https://codeshare.io/2EOYpp 代码没有验证,基本思路应该是这样,再加个 memoization
geelaw
2020-11-16 15:43:04 +08:00
提示:令 F(a,b) 为前 a 个元素分成两个和的差的绝对值为 b 的子集最少需要删除元素个数。

时间 n*mn,m 是一个元素的最大值,n 是元素个数。对 a 可用滚动数组技巧优化。
tamer
2020-11-16 16:57:48 +08:00
@guchengyehai1 时间复杂度是不是没法优化了,目前 n 接近 20 就算不动了
tamer
2020-11-16 16:58:33 +08:00
@guchengyehai1 有没有办法在过程中剪枝, 因为 存在镜像情况, a b 内的元素 对调
tamer
2020-11-16 17:11:54 +08:00
@geelaw 老哥, m 是什么的最大值?

之前也想状态压缩, 但没想出证明其正确性的方法.
构成同一差值的 2 个子集的多个方案, 总是选择 删除元素最少的方案, 这样吗
guchengyehai1
2020-11-16 17:35:34 +08:00
改了一版,不知道是不是正确的
guchengyehai1
2020-11-16 18:42:45 +08:00
验证了一下,memo 优化一下 n 大于 30 都可以跑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/725628

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX