查看: 1646| 回复: 5
跳转到指定楼层
上一主题 下一主题
收起左侧

[其他] 求解一道NP complete变polynomial算法题

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
给一个数组L和数字k,数组L的每个element加起来sum是n
已知 n/2 <= k <= n
需要输出if there exists a subset of L that sums to k. in polynomial time.

而且这道题给了一个可以用的magical function 输入可以是任意数组,output出 if there’s a subset that sums up to n,n为数组总和的一半。假设这个function time complexity是O(1)

感觉如果没给那个可以用的function这道题应该是NP complete。但不知道如何利用这个function达到polynomial time……请教各位大佬 谢谢大家

上一篇:leetcode内存消耗和运行时间异常
下一篇:1/24~3/24 60天刷题全力冲冲冲
推荐
 楼主| 猪头小队长w 2020-1-22 18:13:06 | 只看该作者
全局:
magicsets 发表于 2020-1-22 14:04
首先在 L 最后添加一个元素 x = 2k - n,由给定条件易知 x >= 0,记添加后得到的新数组为 S。

记magic f ...

想了一下 可以对这一部分稍做修改
如果F(S)为真,S可以分成两个子数组,每个的和是(n + 2k - n) / 2 = k
如果把x = 2k - n 从其中一个子数组除去,S变回L,子数组之和变为 k - (2k - n) = n - k
已知 sum(L) = n,其中一个子数组和为n - k,那么另一个的和一定是k,L中存在和为k的子数组。

或者可以直接说因为S的两个互斥子数组和均为k,且只有其中一个包含新元素2n-k,所以另一个的所有元素一定属于原数组L且和为k。
回复

使用道具 举报

推荐
magicsets 2020-1-22 14:04:30 | 只看该作者
全局:
首先在 L 最后添加一个元素 x = 2k - n,由给定条件易知 x >= 0,记添加后得到的新数组为 S。

记magic function为 F。

定理:L 包含和为 k 的子序列,当且仅当 F(S) 为真

简单的证明过程如下

充分性:假设 L 包含和为 k 的子序列,那么数组可以被分成两部分,一部分和为k,另一部分和为n - k,那么我们将x = 2k - n这个新元素添加到和为 n - k 的那个子数组中。易知添加后两个子数组和都为 k 且构成 S 的一个划分,所以F(S)为真。

必要性:假设 F(S) 为真,那么S必然可以分成两个子数组,其和都为Sum(S) / 2 = (n + 2k - n) / 2 = k - n,且其中一个数组必然包含x = 2k - n,那么将 x 从该子数组中去除后,易知剩下的元素和为(k - n) - (2k - n) = k,也就是 L 中存在和为 k 的子序列。

评分

参与人数 2大米 +3 收起 理由
omscszhang + 1 赞一个
猪头小队长w + 2 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
 楼主| 猪头小队长w 2020-1-22 17:12:47 | 只看该作者
全局:
magicsets 发表于 2020-1-22 14:04
首先在 L 最后添加一个元素 x = 2k - n,由给定条件易知 x >= 0,记添加后得到的新数组为 S。

记magic f ...

谢谢大佬的证明!!!
我只想到加上x=2k-n这个元素这一步,后面就卡住没法证明F(S) ---> L包含和为k的subset了...
已加米!!
回复

使用道具 举报

🔗
 楼主| 猪头小队长w 2020-1-22 17:51:29 | 只看该作者
全局:
magicsets 发表于 2020-1-22 14:04
首先在 L 最后添加一个元素 x = 2k - n,由给定条件易知 x >= 0,记添加后得到的新数组为 S。

记magic f ...

hello 对必要性的证明还是有点疑问
如果F(S)为真,S可以分成两个子数组,但是每个的和应该是(n + 2k - n) / 2 = k 而不是 k - n
这样的话如果把x = 2k - n 除去,其中一个数组和就变成了 k - (2k - n) = n - k 而不是 k 了
如何证明可以sum up to k呢
回复

使用道具 举报

🔗
magicsets 2020-1-23 01:51:45 | 只看该作者
全局:
猪头小队长w 发表于 2020-1-22 18:13
想了一下 可以对这一部分稍做修改
如果F(S)为真,S可以分成两个子数组,每个的和是(n + 2k - n) / 2 = k ...

是的.. 必要性证明的那个算数式子写错了。不过重点就是能分出一个和为k的不包括新增元素的子数组,你修改后的证明是正确的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表