一亩三分地

 找回密码 注册账号

扫描二维码登录本站


北美版丁香园
美国和加拿大
疫情地图实时动态追踪

热门职场讲座
Career in Tech
职场晋升之路

Salarytics=Salary Analytics
查询工资数据
系统自动计算每年收入

科技公司如何
用数据分析驱动产品开发
coupon code 250off 立减$250
游戏初创公司招聘工程师、UIUX Designer和游戏策划
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
查看: 539|回复: 5
收起左侧

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

[复制链接] |试试Instant~ |刷题
我的人缘0

分享帖子到朋友圈
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (109)
 
 
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
 楼主| 猪头小队长w 2020-1-22 18:13:06 | 显示全部楼层
本楼: 👍   100% (1)
 
 
0% (0)   👎
全局: 👍   100% (109)
 
 
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
magicsets 2020-1-22 14:04:30 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (1008)
 
 
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 的子序列。

评分

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

查看全部评分

回复

使用道具 举报

我的人缘0
 楼主| 猪头小队长w 2020-1-22 17:12:47 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (109)
 
 
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
 楼主| 猪头小队长w 2020-1-22 17:51:29 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (109)
 
 
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
magicsets 2020-1-23 01:51:45 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   99% (1008)
 
 
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

手机版|||一亩三分地

GMT+8, 2020-2-18 00:30

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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