一亩三分地

 找回密码 注册账号

扫描二维码登录本站

BBS
Offer多多
Salarytics
交友
Learn
Who's Hiring?
疫情动态
指尖新闻
Instant
客户端
微信公众号
扫码关注公众号
留学申请公众号
扫码关注留学申请公众号
Youtube频道
留学博客
关于我们
查看: 774|回复: 5
收起左侧

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

[复制链接] |只看干货 |刷题
我的人缘0

升级   6.43%


分享帖子到朋友圈
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (174)
 
 
0% (0)    👎

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

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

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天刷题全力冲冲冲
我的人缘0

升级   6.43%

 楼主| 猪头小队长w 2020-1-22 18:13:06 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (174)
 
 
0% (0)    👎
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。
回复

使用道具 举报

我的人缘0

升级   80.73%

magicsets 2020-1-22 14:04:30 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   99% (1195)
 
 
0% (8)    👎
首先在 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 很有用的信息!

查看全部评分

回复

使用道具 举报

我的人缘0

升级   6.43%

 楼主| 猪头小队长w 2020-1-22 17:12:47 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (174)
 
 
0% (0)    👎
magicsets 发表于 2020-1-22 14:04
首先在 L 最后添加一个元素 x = 2k - n,由给定条件易知 x >= 0,记添加后得到的新数组为 S。

记magic f ...

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

使用道具 举报

我的人缘0

升级   6.43%

 楼主| 猪头小队长w 2020-1-22 17:51:29 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (174)
 
 
0% (0)    👎
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呢
回复

使用道具 举报

我的人缘0

升级   80.73%

magicsets 2020-1-23 01:51:45 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (1195)
 
 
0% (8)    👎
猪头小队长w 发表于 2020-1-22 18:13
想了一下 可以对这一部分稍做修改
如果F(S)为真,S可以分成两个子数组,每个的和是(n + 2k - n) / 2 = k ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://pay.1point3acres.com/tools/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|||一亩三分地

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

Some icons made by Freepik from flaticon.com

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