【问题标题】:How to divide a set into K subsets such that the sum of the elements in the subsets are minimal?如何将一个集合划分为 K 个子集,使得子集中元素的总和最小?
【发布时间】:2015-09-25 21:40:12
【问题描述】:

我正在研究 DP,当我阅读平衡分区算法时,我遇到了这个问题。在这个算法中,我们可以将一个列表分成两个列表,使得这些列表的元素之和相等。但是,如果我需要 K 个列表并且我需要它们的总和最少怎么办?我想修改平衡分区算法来解决这个问题,但我实际上看不到这样做的方法。

令 S 为 {1,1,5},K = 2 的最优解为 {1,1}, {5}。

有什么提示吗? 提前致谢。

【问题讨论】:

  • 也许我错过了一些东西,但不是{1,1} = 2 的总和和{5} = 5 的总和,因此不相等?
  • @SethKitchen 你用过 5 两次。
  • 另外集合不能包含重复项,因此示例无效。
  • 什么?如果我声明一套袜子。我有 3 只绿色袜子和 3 只蓝色袜子,套装是 {3,3}
  • 是的...主要问题是如何将一个集合划分为 K 个子集,使这些子集中的元素总和最小。我提到了平衡分区算法,因为它做了一些接近它的事情。我给出的示例旨在解释主要问题的解决方案,而不是举例说明平衡分区(在这种情况下,是的,因为 2 != 5 找不到解决方案)。

标签: c++ algorithm dynamic-programming greedy


【解决方案1】:

一个简单的算法是:

sort S in descending order
for each element in S:
    put it into the partition with the smallest sum

在您的示例中,这会将5 放入第一个分区,将1s 放入第二个分区 (K=2)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2013-12-03
    相关资源
    最近更新 更多