- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在研究一些算法编程问题,并且对其中一个有疑问。该问题与此问题中引用的问题相同:USACO: Subsets (Inefficient)
我能够编写一些(非动态)解决方案,这些解决方案对于高 N 来说太慢了。不得不作弊并在线查找一些解决方案。事实证明,快速算法非常简单,但即使知道答案,我仍然看不出如何从问题中得出答案。我可以看到等和子集形式的模式,但我看不到这些模式与算法解决方案之间的联系。
问题(上面的链接)是:
Given a set of consecutive integers from 1 through N (1 <= N <= 39), how many ways can the set be partitioned into two subsets whose sums are identical? E.g., {1,2,3} can be partitioned one way: {1,2} {3}.
对于较大的集合,答案要么是 0(当 N*(N+1)/2 是奇数时),要么是由这个简单的算法给出的:
arr = array of int with (N*(N+1)/4)+1 elements
arr[0]=1 // all other elements initialized to 0
for i = 1 to N
for j = N*(N+1) / 4 downto i
add arr[j-i] to arr[j]
subsetpaircount = arr[N*(N+1)/4] / 2
同样,我可以看到算法是如何工作的,我什至插入了打印语句,这样我就可以“观察”它是如何工作的。我只是看不出算法的操作如何与生成两组分区的不同方式的模式联系起来。
链接问题中的回答可能是相关的,但我也无法理解它是如何工作的:“这与在多项式 (x^1+1/x) 中找到系数 x^0 项是一回事)(x^2+1/x^2)...(x^n+1/x^n)..."
任何人都可以为我澄清联系,或者给我一些解释这个具体问题的引用资料吗?谢谢。
最佳答案
如果集合S = {1,...,N}
被分成两个总和相等的子集,该总和必须是S
总和的一半; S
的总和是N(N+1)/2
所以分区中每个子集的总和必须是N(N+1)/4
.它也必须是一个整数,因此 N(N+1)/2
必须是偶数。
所以问题简化为寻找 S 的子集的数量,其总和为 N(N+1)/4
.分区总数将恰好是这个数字的一半,因为每个分区包含两个这样的子集,并且没有两个分区共享一个子集。
这应该是显而易见的。
现在,让我们列出 S
的子集总和为 k
, 对于任何 k
和任何集合 S
.任何这样的子集都必须有一个最大值,它必须是 S
的一个元素。 .最大值必须是 S
的最大元素, 或者它必须小于 S
的最大元素.这两组子集是截然不同的,所以我们可以分别枚举它们。我们称S
的最大元素为S<sub>max</sub>
.
第二组很简单:它只是 S - { S<sub>max</sub> }
的子集总和为 k
.我们可以通过递归调用子集列表器来找到它们。但第一组几乎一样简单:组中的每个集合都包含 S<sub>max</sub>
其余元素在 S - { S<sub>max</sub> }
中设置。加起来为 k - S<sub>max</sub>
,我们可以再次递归列出。为了完成递归,我们注意到如果 S
是空集,那么如果 k = 0
,恰好有一个合格子集(空集本身),如果 k 不为 0,则没有合格子集。每次递归从 S
中删除一个元素, 因此最终必须达到终止条件。
应该清楚 S
的子集上面的递归函数将使用的只是来自 1
的数字至 S<sub>max</sub>
, 所以我们可以去掉 S
总而言之,递归写成如下:
Subsets(min, max, k) = <br/>
Subsets(min, max - 1, k) <br/>
⋃ { {max, P} | P ∈ Subsets(min, max - 1, k - max) } <br/>
但是我们只需要分区数的计数,所以我们可以稍微简化一下:
Count_Subsets(min, max, k) = <br/>
Count_Subsets(min, max - 1, k) <br/>
+ Count_Subsets(min, max - 1, k - max) <br/>
我们需要通过添加结束条件来完成递归:
If min > max, Count_Subsets(min, max, k) = 1 if k = 0; otherwise 0
(事实上,很容易证明递归意味着当 k 递减到 1
时,值将为 0
,如果 0
小于 k
,则值为 0
,因此我们可以使终止条件发生得更早。)
这为我们提供了简单的计数递归。但由于它调用自己两次,所以最好向后工作(“动态规划”)。我们需要计算 Count_Subsets(1, N, N*(N+1)/4)
,这将要求我们计算 Count_Subsets(1, max, k)
的值对于从 1 到 N 的所有 max 值,以及从 0 到 N*(N+1)/4 的所有 k 值。我们通过从 max = 0 开始,一直工作直到我们达到 min = N 来做到这一点。这正是您的算法所做的; i
是max
,数组是 k 从 0 到 N(N+1)/4
的一组值.
顺便说一句,从上面的描述中应该很明显,a[j]
应该增加 a[j - i]
, 不是 a[j - 1]
关于algorithm - 适当的分区计数算法的解释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14511322/
是一种在 Neo4j 分区之间进行物理分离的方法吗? 这意味着以下查询将转到 node1: Match (a:User:Facebook) 虽然此查询将转到另一个节点(可能托管在 docker 上)
我尝试在我的 SQL 服务器上使用分区函数对我的一个大表进行分区,但我收到一条错误消息 “只能在SQL Server企业版中创建分区功能。只有SQL Server企业版支持分区。” 所以我想知道没有企
在hadoop文件系统中,我有两个文件,分别是X和Y。通常,hadoop制作的文件X和Y的大小为64 MB。是否可以强制hadoop划分两个文件,以便从X的32 MB和Y的32 MB中创建一个64 M
据我了解,如果我们有一个主键,则使用该键对数据进行分区并将其存储在节点中(例如使用随机分区器)。 现在我不确定的是,如果我有多个键(又名复合键),是用于分区数据的键的组合还是它将是第一个主键? 例如,
我正在向我的 SSAS 多维数据集添加分区,我想知道是否有多个分区可以保留在下面?多少太多了,最佳实践限制是 20 还是 200?有没有人可以分享任何真实世界的知识? 最佳答案 这是 another
我有一个包含大约 200 万条记录的大表,我想对其进行分区。 我将 id 列设置为 PRIMARY AUTO_INCRMENT int (并且它必须始终是唯一的)。我有一列“theyear”int(4
我正在做 mysql 列表分区。我的表数据如下 ---------------------------------------- id | unique_token | city | student_
我有一个表,我们每天在其中插入大约 2000 万个条目(没有任何限制的盲插入)。我们有两个外键,其中一个是对包含大约 1000 万个条目的表的引用 ID。 我打算删除此表中超过一个月的所有数据,因为不
我想在一款足球奇幻游戏中尝试使用 MySQL Partitioning,该游戏的用户分布在联赛中,每个联赛都有一个用户可以买卖球员的市场。当很多用户同时玩时,我在这张表中遇到了一些僵局(在撰写本文时大
我是 jQuery 的新手,想知道是否可以获取一些变量并将它们的除法作为 CSS 宽度。到目前为止我在这里: var x = $(".some-container").length; var y =
所以我正在做家庭作业,我需要为分区、斯特林数(第一类和第二类)和第一类的切比雪夫多项式创建递归函数。我的程序应该能够让用户输入一个正整数 n,然后创建名为 Partitions.txt、Stirlin
我在数据框中有一列,其中包含大约 1,4M 行聊天对话,其中每个单元格中的一般格式为 (1): “名称代理 : 对话” 但是,并非列中的所有单元格都采用这种格式。有些单元格只是 (2): “对话” 我
我在尝试隐藏 a 时遇到了一些问题,直到用户单击某个元素为止。 HTML 看起来像: BRAND item 1 item 2 item 3
一.为什么kafka要做分区? 因为当一台机器有可能扛不住(类比:就像redis集群中的redis-cluster一样,一个master抗不住写,那么就多个master去抗写)
我有一些销售数据,我需要发送存储在单独表中的可用槽中的数量。 销售数据示例: id数量112131415369 create table sales (id serial primary key, q
我计划设置多个节点以使用 glusterfs 创建分布式复制卷 我使用主(也是唯一)分区上的目录在两个节点上创建了一个 gluster 复制卷。 gluster volume create vol_d
我正在尝试使用 sum() over (partition by) 但在总和中过滤。我的用例是将每个产品的 12 个月累计到一个月的条目,因此: ITEM MONTH SALES Item
是否可以创建多个 Enumerators出单Enumerator ? 我正在寻找的相当于 List.partition返回 (List[A], List[A]) ,比如 List().partitio
我正在创建一个基于 x86 的非常简单的 Yocto 图像。 我希望/文件系统是只读的,所以我设置了 IMAGE_FEATURES_append = " read-only-rootfs " 在原件的
是否可以使用一次 collect 调用来创建 2 个新列表?如果没有,我该如何使用分区来做到这一点? 最佳答案 collect(在TraversableLike上定义并在所有子类中可用)与集合和Par
我是一名优秀的程序员,十分优秀!