algorithm - Multiset Multisum Problem:形成两个子集所需的最小元素数,每个子集总和为 k 或更多
问题描述
我得到了一个数组(最好说是一个多重集),比如说 L。现在,我需要告诉从这个集中形成两个子集(多重集)所需的最小元素数(L),使得两个子集的每一个元素至少为 k(给定整数)。
我想到的基本想法是:最初,我们有两个空数组/集合。首先,将最大的元素添加到其中一个中。现在,从第二大开始,我将一个元素添加到两个元素中总和最小的子集中,然后继续直到我在这两个中得到至少 k 的总和。这个解决方案在许多测试用例中都有效,但后来我找到了一个反例,证明这个解决方案是不正确的。反例是:取L=[1, 2, 4, 5, 6, 7, 8],k=16。
我知道这个问题在某种程度上是子集和问题的修改(更好地说,高级)版本,但不知道如何做到这一点。有人可以帮忙吗?
解决方案
很明显,我们想从 L 的最大元素构建两个子集,所以让我们假设 L 是按降序排序的。
那么问题就变成了找到最小的 n,使得 L[0:n] 可以分成两个值 k 或更多的子集。
这等效于找到最小的 n 使得 S=L[0:n] 可以拆分为 k 和 sum(S)-k 之间的单个值子集(因为如果这样,另一个子集将自动具有 k 或更大的值是真的)。
因此,您可以运行标准的子集和算法,以递减的大小插入 L 的元素,并在每一步检查在 k 到 sum(S)-k 范围内是否有任何解。
推荐阅读
- php - 如何在分页时检查单选按钮
- python - 确定两个变量是真还是假
- spring-data-r2dbc - R2dbcTimeoutException:连接获取超时
- plesk - 如何在 Plesk 服务器上打开端口 22
- azure - 如何在 Azure Boards 中定义项目版本?
- firebase - 如何减少firebase中的读取次数?
- javascript - 在 Next.js 中实现 Cloudinary 产品库
- wordpress - Dokan 防止商店关闭时添加到购物车
- json.net - 使用不在生成的 JSON 架构中的方面添加的属性
- azure-data-factory-2 - Azure Data Flow - Data Lake Gen 2 Partition Different Schema